【问题标题】:CMake Add and Remove a Macro definition to compile Shared Library/ExecutableCMake 添加和删除宏定义以编译共享库/可执行文件
【发布时间】: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 的构建取消定义它。 感谢您的帮助

【问题讨论】:

    标签: c++ cmake


    【解决方案1】:

    使用target_compile_definitions 指定给定目标的编译定义:

    target_compile_definitions(TestLibrary PUBLIC _SHARED_LIBRARY_)
    

    那么任何与TestLibrary 链接的可执行文件都将继承_SHARED_LIBRARY_ 定义。

    【讨论】:

    • 澄清一下:这是可行的,因为它只将定义添加到 TestLibrary 目标而不是目录中的所有目标。
    • 谢谢 这解决了我的问题。 :) 只需添加一件事,对于遇到此问题的任何人,这必须放在 add_executable(DefinedExecutable main.cpp) 之后
    • @Dzious,在add_library之后。
    猜你喜欢
    • 1970-01-01
    • 2018-03-06
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    • 2023-03-23
    • 2021-06-16
    • 1970-01-01
    • 2016-09-08
    相关资源
    最近更新 更多