1. 程式人生 > >取當前EXE程式所在路徑的C++示例程式碼

取當前EXE程式所在路徑的C++示例程式碼

直接貼原始碼

/*
Title: 取當前EXE程式所在的路徑
Date: 2018-12-25
Author: kagula
Test Environment:
[1]Win10Pro, Visual Studio Community 2017 with update 5.
[2]CentOS7, gcc 5.5.
*/

#ifdef _WIN32
#include <Windows.h>
#else
#include <unistd.h>
#endif // _WIN32_


#include <iostream>

#ifdef _WIN32

std::string GetExePath()
{
	std::string sFullPath;//全路徑,例如:"D:\program files\a.exe"
	std::string sBarePath;//不含程式名路徑,例如: "D:\program files"

	char chpath[MAX_PATH];
	GetModuleFileNameA(NULL, (LPTSTR)chpath, sizeof(chpath));
	sFullPath = chpath;
	std::string::size_type nPos = sFullPath.find_last_of("\\");
	if (nPos != std::wstring::npos)
	{
		sBarePath = sFullPath.substr(0, nPos);
		sBarePath.append("\\");
	}

	return sBarePath;
}
#else
/*
**函式功能:獲取當前可執行檔案的執行路徑個檔名
**    入參:processdir 存放可執行檔案路徑
**    入參:processname 存放可執行檔名字
**    入參:len 入參:processdir的長度
**  返回值:可執行路徑的長度
*/
std::string GetExePath()
{
	char processdir[256];
	char* filename;
        int   len = sizeof(processdir);
	if (readlink("/proc/self/exe", processdir, len) <= 0)
	{
		return std::string();
	}
	if (len >= 0)
	{
		processdir[len] = '/';
	}

	std::string exe_path = processdir;

	size_t nPos = exe_path.find_last_of("/");
	if (nPos > 0)
	{
		exe_path = exe_path.substr(0, nPos);
		exe_path.append("/");
	}
	return exe_path;
}
#endif

int main()
{

	using namespace std;

	cout << GetExePath().c_str() << endl;

#ifdef _DEBUG
	cin.get();
#endif
	return 0;
}

CMakeLists.txt清單

#設定專案名稱
PROJECT(testGetEXEFileDir)
 
#要求CMake的最低版本為2.8
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

#指定可執行程式輸出路徑為執行cmake時路徑的bin子路徑
#預設是輸出到執行cmake命令時的路徑
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
MESSAGE(STATUS "ls EXECUTABLE_OUTPUT_PATH: " ${EXECUTABLE_OUTPUT_PATH})

#CMake執行時,列印路徑
MESSAGE(STATUS "PROJECT_SOURCE_DIR: " ${PROJECT_SOURCE_DIR})
MESSAGE(STATUS "PROJECT_BINARY_DIR: " ${PROJECT_BINARY_DIR})
 
#新增標頭檔案搜尋路徑
INCLUDE_DIRECTORIES(/usr/local/include)
 
#新增庫檔案搜尋路徑
LINK_DIRECTORIES(/usr/local/lib)
LINK_DIRECTORIES(${PROJECT_BINARY_DIR}/../lib)

#如果以"cmake -D DEBUG_MODE=ON .."形式呼叫cmake
#則為C++原始檔設定_DEBUG巨集
IF(DEBUG_MODE)
  ADD_DEFINITIONS(-D_DEBUG)
ENDIF()
 
#用於將當前目錄下的所有原始檔的名字儲存在變數 DIR_SRCS 中
AUX_SOURCE_DIRECTORY(. DIR_SRCS)
 
ADD_EXECUTABLE(testGetEXEFileDir ${DIR_SRCS})
TARGET_LINK_LIBRARIES(testGetEXEFileDir)