如果存在多个依赖项,则强制 cmake 选择依赖位置

Posted

技术标签:

【中文标题】如果存在多个依赖项,则强制 cmake 选择依赖位置【英文标题】:Forcing cmake to choose location of dependency if more than one exist 【发布时间】:2015-01-08 13:26:39 【问题描述】:

/home/karnivaurus/Project 目录中,我有三个文件。我有一个类文件Foo.cpp、一个共享库文件libBar.so 和一个CMakeLists.txt 文件。我也有一个类似的共享库,同名libBar.so,位于/usr/lib

CMakeLists.txt 包含以下内容:

add_library(Foo SHARED Foo.cpp)
target_link_libraries(Foo Bar)

运行cmake 后,库编译正常并创建libFoo.so。如果我再运行命令ldd libFoo.so,则表明存在对/home/karnivaurus/Project/libBar.so的依赖。

现在,我改变了一些东西,而不是创建一个共享库,我想创建一个可执行文件,所以,我创建一个新文件 Main.cpp,它调用 Foo.cpp 中的函数,并将 CMakeLists.txt 更改为:

add_executable(Foo Foo.cpp Main.cpp)
target_link_libraries(Foo Bar)

这编译得很好,并创建了一个可执行文件Foo。但是,如果我现在运行 ldd Foo,它会告诉我存在对 /usr/lib/libBar.so 的依赖。

所以我的问题是:

1) 为什么创建共享库会导致依赖源目录中的libBar.so 文件,而创建可执行文件会导致依赖usr/lib 目录中的libBar.so 文件?

2) 如何强制 cmake 创建对其中一个而不是另一个的依赖?

【问题讨论】:

【参考方案1】:

回答问题 2

这应该使Foo链接/home/karnivaurus/Project/libBar.so

link_directories( /home/karnivaurus/Project )
add_executable(Foo Foo.cpp Main.cpp)
target_link_libraries(Foo Bar)

如果这不起作用,您可以随时在对target_link_libraries 的调用中添加库的绝对路径:

target_link_libraries(Foo /home/karnivaurus/Project/libBar.so)

【讨论】:

以上是关于如果存在多个依赖项,则强制 cmake 选择依赖位置的主要内容,如果未能解决你的问题,请参考以下文章

webpack 中的可选依赖项

当任务依赖关系过期时,luigi 可以重新运行任务吗?

在现代CMake项目中存档静态依赖项

如何在 CMake 中构建过程后复制目标的所有运行时依赖项?

Visual Studio 2017 - 为依赖项禁用 CMake

使用cmake或gcc在linux上创建一个可立即使用的安装包,包括shred依赖项