运行cmake CMakeLists.txt后
我收到以下警告
CMake Warning at src/CMakeLists.txt:32 (add_executable):
Cannot generate a safe runtime search path for target MMPEditor because
files in some directories may conflict with libraries in implicit
directories:
runtime library [libQt5Widgets.so.5] in /usr/lib/x86_64-linux-gnu may be hidden by files in:
/home/ch/Qt/5.2.1/gcc_64/lib
runtime library [libQt5Core.so.5] in /usr/lib/x86_64-linux-gnu may be hidden by files in:
/home/ch/Qt/5.2.1/gcc_64/lib
runtime library [libQt5Gui.so.5] in /usr/lib/x86_64-linux-gnu may be hidden by files in:
/home/ch/Qt/5.2.1/gcc_64/lib
runtime library [libQt5OpenGL.so.5] in /usr/lib/x86_64-linux-gnu may be hidden by files in:
/home/ch/Qt/5.2.1/gcc_64/lib
Run Code Online (Sandbox Code Playgroud)
其中一些库可能无法正确找到.
一个文件被另一个文件隐藏是什么意思,我怎样才能让CMake确定哪个文件要链接到哪个文件夹?
Tsy*_*rev 16
该警告实际上意味着什么:
foo.so.x.y.例如,消息
runtime library [libQt5Widgets.so.5] in /usr/lib/x86_64-linux-gnu may be hidden by files in:
/home/ch/Qt/5.2.1/gcc_64/lib
Run Code Online (Sandbox Code Playgroud)
意味着该项目请求链接libQt5Widgets.so.5位于目录中的库/usr/lib/x86_64-linux-gnu。
但是同名的库也存在于目录中/home/ch/Qt/5.2.1/gcc_64/lib,CMake将其视为“隐式目录”,加载器在任何情况下都会在其中搜索。(可能是因为该目录已在变量中列出LD_LIBRARY_PATH)。
警告的后果:
由于运行时出现不可预测的结果很少是可接受的,因此最好修复该警告。可能的方法包括以下几种:
确保 CMake 选择您实际想要使用的库。
例如,您实际上可能打算使用 QT 下的自定义安装/home/ch/Qt/5.2.1/gcc_64。在这种情况下,您需要向 CMake 暗示您的意图。例如通过设置CMAKE_PREFIX_PATH变量。
卸载位于“错误”目录中的库。
例如,如果您有较新版本的库并且从未打算使用旧版本,那么为了避免混淆,最好卸载后者。
如果加载程序因包含在变量中而搜索到“错误”目录LD_LIBRARY_PATH,则将此变量设置为不包含该目录。
CMake 能够正确构建无需LD_LIBRARY_PATH设置即可运行的项目。
如果加载程序搜索到“错误”目录,因为它包含一些其他库,请消除在可执行文件中使用该库。
如果您的 PC 上有两个库“存储库”,则只能在单个存储库中保证库之间的兼容性。库的混合使用可能会导致运行时的不兼容问题。
find_libraryfind_library(LIBRARY_NAME PATHS "/usr/lib/x86_64-linux-gnu" NO_DEFAULT_PATH) 在哪里
PATHS 代表库的确切路径NO_DEFAULT_PATH 意味着,cmake 不会在其他任何地方搜索检查 lib 的值并包含路径 message(status, ${LIBRARY_NAME})
find_package:它比前面的示例稍微复杂一些,但本质上是相同的。
对于每个包,您必须运行find_package:
创建具有 name 的文件Find<Packagename>.cmake,例如,如果您正在寻找 cppunit,则必须创建FindCPPUNIT.cmake.
在该文件中,您必须find_path在包含文件和find_librarylib 文件上运行,例如“如果您正在处理find_library”。
find_path(CPPUNIT_INCLUDE_DIR PATHS "/usr/include/x86_64-linux-gnu" NO_DEFAULT_PATH)
find_library(CPPUNIT_LIBRARY PATHS "/usr/lib/x86_64-linux-gnu" NO_DEFAULT_PATH)
Run Code Online (Sandbox Code Playgroud)
然后你必须将文件的路径添加到CMAKE_MODULE_PATH.