取當前EXE程式所在路徑的C++示例程式碼
阿新 • • 發佈:2018-12-26
直接貼原始碼
/* 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)