如果存在多个依赖项,则强制 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 选择依赖位置的主要内容,如果未能解决你的问题,请参考以下文章
如何在 CMake 中构建过程后复制目标的所有运行时依赖项?