2016-04-25 72 views
0

我的这些目录中的文件: 的CMakeLists.txt datalink.c datalink.h protocol.a protocol.hcmake的化妆找不到-lprotocol

所有这些文件是从我的老师,除了得到的CMakeLists.txt。

#CMakeLists.txt 
cmake_minimum_required(VERSION 3.5) 
project(DataLinkSimulator) 
INCLUDE_DIRECTORIES(.) 
set(SOURCE_FILES datalink.c protocol.a datalink.h protocol.h) 
add_executable(DataLinkSimulator ${SOURCE_FILES}) 
target_link_libraries(DataLinkSimulator protocol.a) 

我运行'cmake'。在这个目录中,它工作。 但是,当我运行'make'时,它给了我这些错误。

Scanning dependencies of target DataLinkSimulator 
[ 50%] Building C object CMakeFiles/DataLinkSimulator.dir/datalink.c.o 
[100%] Linking C executable DataLinkSimulator 
/usr/bin/ld: cannot find -lprotocol 
collect2: 错误:ld 返回 1 #(means "error: ld return 1") 
CMakeFiles/DataLinkSimulator.dir/build.make:94: recipe for target 'DataLinkSimulator' failed 
make[2]: *** [DataLinkSimulator] Error 1 
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/DataLinkSimulator.dir/all' failed 
make[1]: *** [CMakeFiles/DataLinkSimulator.dir/all] Error 2 
Makefile:83: recipe for target 'all' failed 
make: *** [all] Error 2 

错误“无法找到-lprotocol”必须由ld的错误协议作为共享库引起。但我的协议是一个静态库。所以我很困惑。

如果我自己编辑makefile而不是使用cmake,它可以正常工作。

datalink: datalink.c datalink.h 
    gcc datalink.c protocol.a -o datalink -lm -lstdc++ -m32 
clean: 
    ${RM} datalink 
    ${RM} *.o 

我用了一个 “让VERBOSE = 1”:

/usr/local/bin/cmake -H/home/shantom/Desktop/FileRecv/Lab1-linux -B/home/shantom/Desktop/FileRecv/Lab1-linux --check-build-system CMakeFiles/Makefile.cmake 0 
/usr/local/bin/cmake -E cmake_progress_start /home/shantom/Desktop/FileRecv/Lab1-linux/CMakeFiles /home/shantom/Desktop/FileRecv/Lab1-linux/CMakeFiles/progress.marks 
make -f CMakeFiles/Makefile2 all 
make[1]: Entering directory '/home/shantom/.wine/drive_c/Program Files/QQ/Users/1044950475/FileRecv/Lab1-linux' 
make -f CMakeFiles/DataLinkSimulator.dir/build.make CMakeFiles/DataLinkSimulator.dir/depend 
make[2]: Entering directory '/home/shantom/.wine/drive_c/Program Files/QQ/Users/1044950475/FileRecv/Lab1-linux' 
cd /home/shantom/Desktop/FileRecv/Lab1-linux && /usr/local/bin/cmake -E cmake_depends "Unix Makefiles" /home/shantom/Desktop/FileRecv/Lab1-linux /home/shantom/Desktop/FileRecv/Lab1-linux /home/shantom/Desktop/FileRecv/Lab1-linux /home/shantom/Desktop/FileRecv/Lab1-linux /home/shantom/Desktop/FileRecv/Lab1-linux/CMakeFiles/DataLinkSimulator.dir/DependInfo.cmake --color= 
make[2]: Leaving directory '/home/shantom/.wine/drive_c/Program Files/QQ/Users/1044950475/FileRecv/Lab1-linux' 
make -f CMakeFiles/DataLinkSimulator.dir/build.make CMakeFiles/DataLinkSimulator.dir/build 
make[2]: Entering directory '/home/shantom/.wine/drive_c/Program Files/QQ/Users/1044950475/FileRecv/Lab1-linux' 
[ 50%] Linking C executable DataLinkSimulator 
/usr/local/bin/cmake -E cmake_link_script  CMakeFiles/DataLinkSimulator.dir/link.txt --verbose=1 
/usr/bin/cc  CMakeFiles/DataLinkSimulator.dir/datalink.c.o -o DataLinkSimulator -Wl,-Bstatic -lprotocol -Wl,-Bdynamic 
/usr/bin/ld: cannot find -lprotocol 
collect2: 错误:ld 返回 1 
CMakeFiles/DataLinkSimulator.dir/build.make:94: recipe for target 'DataLinkSimulator' failed 
make[2]: *** [DataLinkSimulator] Error 1 
make[2]: Leaving directory '/home/shantom/.wine/drive_c/Program Files/QQ/Users/1044950475/FileRecv/Lab1-linux' 
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/DataLinkSimulator.dir/all' failed 
make[1]: *** [CMakeFiles/DataLinkSimulator.dir/all] Error 2 
make[1]: Leaving directory '/home/shantom/.wine/drive_c/Program Files/QQ/Users/1044950475/FileRecv/Lab1-linux' 
Makefile:83: recipe for target 'all' failed 
make: *** [all] Error 2 

回答

-1

为了了解你需要启动使用verbose mode命令行make命令的错误;在Linux上paltform这意味着启动:

make VERBOSE=1 

通过这种方式,你将不得不用来编译代码的整个命令行。

为了解决你的错误你可以:

  • 添加link_directories(directory_where_you_have_library)CMake的行添加目录,你必须protocol.a之前target_link_libraries线
  • 添加protocol.a绝对路径。

你修改Makefile的作品,因为可能是你中的所有文件的同一目录下有它而产生的CMake在不同的目录许多Makefile文件从生成根目录开始,因此需要-L GCC标志(获得通过link_directories)或 - l具有绝对路径(可以通过绝对路径添加protocol.a)。

+0

我使用了“make VERBOSE = 1”,但附加信息看起来没有错。并且link_directories或绝对路径不作任何更改。不管怎么说,还是要谢谢你。 – Shantom

+0

你可以发布与国旗verbose = 1出现的内容吗? –