CMake 添加和删除宏定义以编译共享库/可执行文件
Posted
技术标签:
【中文标题】CMake 添加和删除宏定义以编译共享库/可执行文件【英文标题】:CMake Add and Remove a Macro definition to compile Shared Library/Executable 【发布时间】:2019-11-29 09:06:50 【问题描述】:我有一个 c++ 代码,我需要以两种方式编译,一个共享库和一个可执行文件,为此,我的一些函数在编译为共享库时需要未定义。所以我决定使用#ifdef MACRO
并在我的CMakeLists.txt 中定义MACRO
。
这是我的情况:
文件function.cpp
:
#include <iostream>
#ifdef _SHARED_LIBRARY_
void printSharedLibrary(void)
std::cout << "Shared Library" << std::endl;
#else
void printExecutable(void)
std::cout << "Executable" << std::endl;
#endif
文件main.cpp
:
#ifdef _SHARED_LIBRARY_
void printSharedLibrary(void);
#else
void printExecutable(void);
#endif
int main (void)
#ifdef _SHARED_LIBRARY_
printSharedLibrary();
#else
printExecutable();
#endif
文件CMakeLists.txt
:
project(ProjectTest)
message("_SHARED_LIBRARY_ ADDED BELOW")
add_definitions(-D_SHARED_LIBRARY_)
add_library(TestLibrary SHARED functions.cpp)
add_executable(DefinedExecutable main.cpp) // Only here to be able to test the library
target_link_libraries(DefinedExecutable TestLibrary)
message("_SHARED_LIBRARY_ REMOVED BELOW")
remove_definitions(-D_SHARED_LIBRARY_)
add_executable(UndefinedExecutable main.cpp functions.cpp)
输出:
$> ./DefinedExecutable
Executable
$> ./UndefinedExecutable
Executable
预期输出:
$> ./build/DefinedExecutable
Shared Library
$> ./build/UndefinedExecutable
Executable
为了构建它,我使用:rm -rf build/ ; mkdir build ; cd build ; cmake .. ; make ; cd ..
所以我的问题是有没有办法为DefinedExecutable
的构建定义_SHARED_LIBRARY_
,然后为UndefinedExecutable
的构建取消定义它。
感谢您的帮助
【问题讨论】:
【参考方案1】:使用target_compile_definitions
指定给定目标的编译定义:
target_compile_definitions(TestLibrary PUBLIC _SHARED_LIBRARY_)
那么任何与TestLibrary
链接的可执行文件都将继承_SHARED_LIBRARY_
定义。
【讨论】:
澄清一下:这是可行的,因为它只将定义添加到TestLibrary
目标而不是目录中的所有目标。
谢谢 这解决了我的问题。 :) 只需添加一件事,对于遇到此问题的任何人,这必须放在 add_executable(DefinedExecutable main.cpp)
行之后
@Dzious,在add_library
之后。以上是关于CMake 添加和删除宏定义以编译共享库/可执行文件的主要内容,如果未能解决你的问题,请参考以下文章