【问题标题】:link_directories() bring in extra link flagslink_directories() 引入额外的链接标志
【发布时间】:2014-01-20 18:00:27
【问题描述】:

这个问题我已经筋疲力尽了……我花了好几天的时间。

我使用 target_link_libraries 链接 A 与 B 和 C

target_link_libraries(A rootdir/B.lib rootdir/C.lib)

虽然B需要E和F目录中的一些其他文件,但我使用

link_directories(rootdir/E rootdir/F)

要包含目录 E 和 F,但是使用 make VERBOSE=1 我发现虽然 cmake 在 E 和 F 之前添加 -i 并将它们传递给链接,但它还添加了一些额外的标志,例如

-Wl,-rpath,rootdir/E:rootdir/F:

这些额外的参数从何而来?我该如何解决这个问题? 我将不胜感激任何帮助!谢谢!

【问题讨论】:

  • 你在链接器标志中设置了什么吗?
  • 没什么,额外的标志“-Wl,-rpath, rootdir/E:rootdir/F:”是由link_directories()引入的
  • 我不确定 -WI 做了什么,但我会理解 -rpath,因为 link_directories() 接受相对路径
  • 感谢 Pandrei 的解释。

标签: cmake


【解决方案1】:

“问题”在命令link_directories

> cat CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(Boo)
link_directories("/path/to/Foo")
add_executable(boo Boo.cpp)
target_link_libraries(boo "/path/to/Foo/libFoo.a")
> cmake -H. -B_builds -DCMAKE_VERBOSE_MAKEFILE=ON
> cmake --build _builds
/usr/bin/c++ ... -o boo -Wl,-rpath,/.../Foo 

如果您使用find_library 命令查找Foo 并使用target_link_libraries 标志链接它 将被删除:

> cat CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(Boo)
add_executable(boo Boo.cpp)
find_library(LIBFOO Foo HINTS "/path/to/Foo/")
if(NOT LIBFOO)
  message(FATAL_ERROR "Library `Foo` not found in `/path/to/Foo`")
endif()
target_link_libraries(boo ${LIBFOO})
> cmake -H. -B_builds -DCMAKE_VERBOSE_MAKEFILE=ON
> cmake --build _builds
/usr/bin/c++ CMakeFiles/boo.dir/Boo.cpp.o -o boo -rdynamic /path/to/Foo/libFoo.a

相关(共享库)

如果你没有链接到共享库,你可以忽略这个标志:

相关(使用要求)

请注意,这种情况与库使用要求有关 (您需要链接另一个库才能使用您安装的库):

【讨论】:

  • 非常感谢您的大力帮助。我使用 link_directories 因为链接库 b.lib 需要一些其他文件(只是普通文件,而不是库),这些文件几乎都在不同的目录中,如果我使用 find_library 我需要编写很多 find_library 命令。我认为链接库可能需要包含其他一些文件和目录是一个常见要求,为什么没有办法满足这个要求?当然,有一种方法可以通过link_directories添加包含的目录,但这不是一种可行的方法。
  • 我不明白为什么它传递了一些我的链接器无法识别的标志,即使没有额外的标志,在包含的目录之间添加的冒号也无法被我的链接器识别,链接器将报错找不到“rootdir/E:rootdir/F”。这个我真的看不懂……我觉得link_directories在目录前加上-i,把这些参数传给链接器就够了……
  • @waitsummer why there is not a way to meet this requirement 查看我关于使用要求的说明,阅读documentation 关于find_package 和我的答案:1, 2 恕我直言,这正是您的需要
  • @waitsummer I can't understand why it pass some flags which my linker can not recognize 你使用的是什么操作系统、编译器、cmake 版本?我用 gcc 尝试了我的 linux ubuntu,它工作正常,链接器的路径由 : 分隔,没有错误
猜你喜欢
  • 1970-01-01
  • 2012-01-31
  • 2011-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多