CMake's link_directories issue with static lib

2019-03-06 11:21发布

问题:

I have a static library in /PATH directory, and when I tried to use the library with link_directories as follows:

link_directories(/PATH)
target_link_libraries(CppHello libHelloLib.a)

I had an error message:

ld: library not found for -lHelloLib
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[3]: *** [/PATH] Error 1
make[2]: *** [CMakeFiles/CppHello.dir/all] Error 2
make[1]: *** [CMakeFiles/CppHello.dir/rule] Error 2

Instead, I had to specify the path as follows to make it work:

target_link_libraries(CppHello /PATH/libHelloLib.a)

What might be wrong? Is this an issue with Cmake on Mac OS X, or did I just miss something?

回答1:

You call link_directories() after creating executable: link_directories affects only on targets, created after it: https://cmake.org/cmake/help/v3.4/command/link_directories.html. The result is that the correct -lHelloLib flag is added to the target, but the lib search path isn't updated with a -L/PATH flag.

Instead put the call to link_directories() before you create any targets.


Since 3.3 version CMake documentation for target_link_libraries explicitely specifies, which kind of items for link it accepts. Among them:

  • A full path to a library file
  • A plain library name

So, you should specify either full path to the library file, or only name for the library, without file's extension(.a) and prefix(lib). Error message in you case shows, that CMake has tried to handle even filename-only library, but without success(some sort of Undefined Behaviour).

While previous versions of CMake doesn't document this command so clear, they, probably, follow same convention.



标签: macos cmake