最終實現了。方案如下。
- 設置兩個config.h.in,即此時有兩份config.h
- 注意,生成文件夾是build目錄下,因為config.h的生成是檢測到已有就不修改
option(SUB_HEART "Sub client program heart" on) configure_file ( "${PROJECT_SOURCE_DIR}/config_heart.h.in" "${PROJECT_BINARY_DIR}/spade-heart/config.h" ) option(SUB_DIAMOND "Sub client program diamond" on) configure_file ( "${PROJECT_SOURCE_DIR}/config_diamond.h.in" "${PROJECT_BINARY_DIR}/spade-diamond/config.h" )
- 使用target_include_directories,即不同的目標包含不同的config.h
target_include_directories(spade_diamond PRIVATE "${PROJECT_BINARY_DIR}/spade-diamond") target_include_directories(spade_heart PRIVATE "${PROJECT_BINARY_DIR}/spade-heart")
------
經添加的不能刪除
-----------------
放棄
同一個源碼,編譯兩次使用不同的宏設置,發現已有config.h文件后不會去修改,即cmake前要把上次cmake的文件均刪除,而且同一次cmake里生成后不會修改
如果是不同源碼,每個源碼的頭文件相同
那么我同一個源碼,設置宏,不修改config.h,但是修改引入的庫,可以實現
分支不在config,而是庫
此時config沒什么實際意義
繼續
------
cmake執行shell命令
https://www.cnblogs.com/jackyim/p/3770508.html
未驗證
https://blog.csdn.net/qq_28584889/article/details/97758450
----------
message(${PROJECT_BINARY_DIR})
message(${PROJECT_SOURCE_DIR})
BINARY是執行cmake的目錄,即build
SOURCE是CMakeLists.txt所在的目錄
---------------------------
- CMakeLists.txt添加
option(SUB_HEART "Sub client program heart" on) option(SUB_DIAMOND "Sub client program diamond" on) configure_file ( "${PROJECT_SOURCE_DIR}/config.h.in" "${PROJECT_BINARY_DIR}/config.h" )
跟在project后
config.h是由config.h.in生成的
- config.h.in內容
#cmakedefine SUB_HEART
#cmakedefine SUB_DIAMOND
即兩個宏均開啟
--------------------------------
[場景]
當前有四個程序
club 服務器端
spade 客戶端
diamond 客戶端子程序
heart 客戶端子程序
也就是說1個服務器,兩個客戶端
在編譯的時候,編譯兩個spade,根據編譯選項,一個spade調用diamond程序,另一個spade調用heart程序