如何在CMake中添加.h / .o已编译的库

时间:2017-07-10 00:54:25

标签: c gcc cmake

似乎是一个简单的问题,但我似乎无法在此找到任何资源...

我的项目树很简单:main.c包含list.h,结尾。

cmake_minimum_required(VERSION 3.7)
project(as03)

set(CMAKE_C_STANDARD 11)

set(SOURCE_FILES main.c list.h)

add_executable(as03 ${SOURCE_FILES} list.o)

此CMakeLists.txt文件出错:

/home/.../clion-2017.1.2/bin/cmake/bin/cmake --build /home/shawn/CLionProjects/CMPT300/as03/cmake-build-debug --target all -- -j 4
[ 50%] Linking C executable as03
/usr/bin/ld: ../list.o: relocation R_X86_64_32S against undefined symbol `headlist' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: error: ld returned 1 exit status
CMakeFiles/as03.dir/build.make:96: recipe for target 'as03' failed
make[2]: *** [as03] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/as03.dir/all' failed
make[1]: *** [CMakeFiles/as03.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

编辑:环境是使用gcc 6.3.0的Linux上的CLion IDE。

EDIT2:道歉,

relocation R_X86_64_32S against undefined symbol `headlist' can not be used when making a shared object

错误不是CMake的问题,但可以通过命令行编译相应的makefile来重现:

CC=gcc
CFLAGS=-w -std=c11
PROG=simulation-app
OBJS= main.o list.o

simulation-app: $(OBJS)
    $(CC) $(CFLAGS) -o $(PROG) $(OBJS)

main.o: main.c
    $(CC) $(CFLAGS) -c main.c


clean:
    ls | grep -v list.o | grep .o | xargs rm

原来我的一个同事遇到了这个问题,并通过重新安装一个新的linux-distro解决了......不,谢谢。

所以这似乎是一个机器相关的问题。我尝试将我的gcc版本降级到5.4.1以匹配编译此.o的机器,但没有任何改变:(

1 个答案:

答案 0 :(得分:1)

add_executable(as03 main.c list.c)

您应该只在目标之后使用列表中的源,而不是目标文件。

除非您使用或想要支持IDE(尤其是Visual Studio),否则您也不需要列表中的标题。