gpt4 book ai didi

c++ - CMake - 项目级宏添加到应用程序级 target_link_libraries

转载 作者:太空宇宙 更新时间:2023-11-04 08:38:49 25 4
gpt4 key购买 nike

我的项目中有很多库,还有很多单独的应用程序。我的一些库有依赖库,其中一些是外部库,我想要一种使应用程序 CMakeList.txt 文件更简单的方法。我希望使用宏来简化。

下面是一个大大简化的测试用例。例如,在我的项目中,包括我的一个库还需要用于 ImageMagick、pugixml、jsoncpp、liboauthcpp 等的 include_directories、link_directories 和 target_link_libraries……而且,其中一些第三方库需要编译器标志。下面我的项目版本的 _LIB() 宏会长得多...

问题:有没有办法让下面的 _LIB() 宏自动向调用宏的 target_link_libraries 添加一些内容?

我不确定该怎么做,因为 target_link_libraries 参数 1 是目标名称,它会因应用程序而异。

~/codeTest/CMakeLists.txt

cmake_minimum_required(VERSION 2.6)
project(codeTest)

macro(_LIB)
include_directories(~/codeTest/lib)
link_directories(~/codeTest/lib)
endmacro()

add_subdirectory(lib)
add_subdirectory(app)

~/codeTest/lib/CMakeLists.txt

include_directories(~/codeTest/lib)
add_library(lib lib.cpp)

~/codeTest/lib/lib.h

#ifndef __LIB__
#define __LIB__

namespace LIB {

unsigned long libFunc(unsigned long inValue);

}

#endif

~/codeTest/lib/lib.cpp

#include <lib.h>

namespace LIB {

unsigned long libFunc(unsigned long inValue) {
return inValue+1;
}

}

~/codeTest/app/CMakeLists.txt

_LIB()
add_executable(app app.cpp)
target_link_libraries(app lib)

~/codeTest/app/app.cpp

#include <lib.h>
using namespace LIB;

int main() {
unsigned long x = 1;
unsigned long y = libFunc(x);
}

最佳答案

随着项目复杂度的增加,您很快就会发现将多个{link,include}_directories 指令集中在一个宏中是不灵活的解决方案,应该明确指定它们。

我建议您考虑模块的概念 (/usr/share/cmake/Modules/):对于您的每个外部依赖项,使用一个 Find*.cmake 文件,可以在 cmake 模块目录(见上文)或包的目录(如果其作者编写了相应的模块)中找到。或者您可以自己编写。

这些模块通常会定义一些变量(例如,Boost_INCLUDE_DIRSBoost_LIBRARY_DIRS),您只会在那些真正需要的子项目中使用这些变量。

因此,对于每个子项目,您指定 include_.../link_... 指令显式引用模块或其他子项目中定义的变量(用于内部依赖项) .

此外,对于用户来说,cmake 中的宏和函数确实是非常不可预测的,他们希望它们的行为类似于众所周知的编程语言(CJavaRuby, ...) 当您开始向它们添加参数时;阅读有关变量缓存、作用域以及字符串和列表之间的转换的信息。

关于c++ - CMake - 项目级宏添加到应用程序级 target_link_libraries,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24817012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com