为什么 CMake find_package 忽略链接器标志?

Why is CMake find_package ignoring linker flags?

我正在 Cray 系统上进行开发,该系统要求在找到动态库之前传递“-dynamic”。就我而言,我正在尝试 link 使用 libtiff。命令 cc main.cpp -ltiff 因找不到文件而失败,但 cc main.cpp -dynamic -ltiff 有效。我相信这个文件未找到行为正在绊倒 CMake 的 find_package.

当我使用 CMake(版本 3.5.2)并从命令行传递 -DCMAKE_EXE_LINKER_FLAGS:STRING="-dynamic" 时,find_package(TIFF) 有效。但是当我像这样在 CMakeLists.txt 中设置它时:

set(CMAKE_EXE_LINKER_FLAGS "-dynamic")
find_package(TIFF REQUIRED)

找不到 libtiff。但如果我尝试:

set(CMAKE_EXE_LINKER_FLAGS "-dynamic" CACHE STRING "" FORCE)
find_package(TIFF REQUIRED)

第一次失败,但将“-dynamic”放入缓存,然后在第二次 运行 上工作。 如果我手动设置 TIFF_LIBRARY_RELEASE 指向 .so 那么 find_package 也将起作用(通过填写其余变量)。

不将其作为参数传递的正确方法是什么?

对于Cray的编程环境和动态链接,我通常发现最好在配置和构建之前设置环境变量CRAYPE_LINK_TYPE=dynamic。这通常可以更好地与您可能使用的任何其他模块一起使用。

根据@Tsyvarev 上面的评论:

调用 project() 时会探测编译器。因此,在这种情况下,编译器标志将更改库并包含路径,您必须在调用项目之前设置 CMAKE_EXE_LINKER_FLAGS。