我有一个依赖于Intel's oneTBB的项目。我的项目结构如下:
external/
| - CMakeLists.txt
| - oneTBB/ (this is a git submodule)
| - ...
include/
lib/
include/
CMakeLists.txt
目前,我通过手动构建oneTBB
并通过运行以下(bash)命令将其安装在external/oneTBB/prefix
目录中来进行编译:
cd oneTBB
mkdir -p prefix
mkdir -p build
cd build
cmake -DCMAKE_INSTALL_PREFIX=../prefix -DTBB_TEST=OFF ..
cmake --build .
cmake --install .
然后我简单地使用这个前缀包含和链接。(我从下面的oneTBB自述文件中得到这个)
虽然这没有问题,我目前正在尝试清理我的CMake,使其更容易在Windows上构建。理想情况下,我希望能达到一个点,我可以简单地运行:
mkdir build
cd build
cmake ..
cmake --build .
我的项目将生成自身和所有依赖项。
我通过简单地将(添加到external/
中的CMakeLists.txt中)与glfw和eigen等其他依赖项一起使用,得到了这个结果:
add_subdirectory(glfw)
add_subdirectory(eigen)
但是添加add_subdirectory(oneTBB)
会引发很多警告,首先是:
CMake Warning at external/oneTBB/CMakeLists.txt:116 (message):
You are building oneTBB as a static library. This is highly discouraged
and such configuration is not supported. Consider building a dynamic
library to avoid unforeseen issues.
-- TBBBind build targets are disabled due to unsupported environment
-- Configuring done
CMake Warning (dev) at external/oneTBB/src/tbb/CMakeLists.txt:15 (add_library):
Policy CMP0069 is not set: INTERPROCEDURAL_OPTIMIZATION is enforced when
enabled. Run "cmake --help-policy CMP0069" for policy details. Use the
cmake_policy command to set the policy and suppress this warning.
INTERPROCEDURAL_OPTIMIZATION property will be ignored for target 'tbb'.
This warning is for project developers. Use -Wno-dev to suppress it.
我不需要将oneTBB构建为静态库。我的尝试是否做错了什么?实际上,我所需要的只是将oneTBB构建为动态库,并放置在我可以链接到的地方(而不是在整个系统上安装它)
类似问题:
我还包含了依赖于GKlib的METIS库,目前我使用类似于oneTBB
的方法来完成,在oneTBB
中,我使用以下脚本手动构建每个库:
# Setup the GKlib library:
cd GKlib
mkdir -p prefix
mkdir -p build
cd build
cmake -DCMAKE_INSTALL_PREFIX=../prefix ..
cmake --build . -j
cmake --install .
cd ../../
# Setup the METIS library:
cd METIS
mkdir -p prefix
make config prefix=../prefix gklib_path=../GKlib/prefix #(GKLib path is done from root, install path done relative to build)
make install -j
cd ../
当我尝试使用以下命令添加它们时:
add_subdirectory(GKlib)
add_subdirectory(METIS)
它抛出METIS找不到GKlib的错误:
CMake Error at external/METIS/CMakeLists.txt:50 (add_subdirectory):
add_subdirectory given source "build/xinclude" which is not an existing
directory.
虽然我认识到这是一个单独的问题,但我想将其包括在这里,因为它与我的add_subdirectory()
问题相关
2条答案
按热度按时间ljo96ir51#
我不需要将oneTBB构建为静态库。我的尝试是否做错了什么?实际上,我所需要的只是将oneTBB构建为动态库,并放置在我可以链接到的地方(而不是在整个系统上安装它)
所有的诊断消息都表明它实际上被配置为构建为一个静态库,并且其他线索指向在
add_subdirectory(oneTBB)
的作用域中将BUILD_SHARED_LIBS
设置为false的可能性。如果查看oneTBB's CMakeLists.txt file,您将看到以下内容:
在那之后,你会得到
oneTBB's CMakeLists.txt file的相应部分为:
这两个线索都表明,在
add_subdirectory(oneTBB)
所在的变量作用域中,BUILD_SHARED_LIBS
被设置为一个错误值。在执行
add_subdirectory(oneTBB)
之前,将BUILD_SHARED_LIBS
设置为真实值(例如1
、TRUE
、YES
、ON
等),然后恢复之前的值。前。
eqfvzcg82#
许多项目希望您单独调用CMake,而不是使用
add_subdirectory
将它们添加到现有项目中。虽然可能有一种方法可以使add_subdirectory
与oneTBB一起工作,但有一种更简单的方法。CMake有一个函数,允许您在构建时下载、构建和安装外部项目:ExternalProject_Add.
下面是一个spdlog的例子,直接取自我自己的一个项目:
之后,我的项目只链接到创建的库目标:
为了适应oneTBB,你必须切换出仓库URL和提交散列,并添加你自己的CMake定义(即
"-DTBB_TEST=OFF"
)。根据oneTBB如何设置它的include和library目录,你可能还必须修改target_include_directories
和/或target_link_directories
行。我还没有查到这一点,但我相信你能弄清楚。不管外部项目是以静态库还是共享库的形式构建的,都可以这样做。不过,你不应该使用git子模块,而是让CMake来下载。(它只会下载和构建一次;如果外部项目已经生成并且是最新的,则后续生成将不会重新生成该外部项目。)