使用 clang 编译最小测试共享库

标签 c makefile clang shared-libraries freebsd

我正在尝试使用以下方法在 FreeBSD 中编译一个最小的测试共享库:

FreeBSD clang version 6.0.1 (tags/RELEASE_601/final 335540) (based on LLVM 6.0.1)
Target: x86_64-unknown-freebsd12.0
Thread model: posix
InstalledDir: /usr/bin

测试.c

#include "test.h"

int SampleFunction(int a, int b)
{
    return a * b;
}

测试.h

#ifndef TESTLIB_H
#define TESTLIB_H

extern int SampleFunction(int a, int b);

#endif

Makefile

# Makefile TESTLIB

TEST_OBJS = test.o
TEST_HEADERS = test.h
TEST_LIB = test.so

CC = cc

testlib:    $(TEST_OBJS)
        $(CC) -fpic -o $(TEST_LIB) $(TEST_OBJS)

# Rebuilt if this Makefile or header changes
$(TEST_OBJS):   Makefile $(TEST_HEADERS)

输出:

$ make testlib
cc  -O2 -pipe -c test.c -o test.o
cc -fpic -o test.so test.o
/usr/bin/ld: error: undefined symbol: main
>>> referenced by crt1.c:76 (/usr/src/lib/csu/amd64/crt1.c:76)
>>>               /usr/lib/crt1.o:(_start)
cc: error: linker command failed with exit code 1 (use -v to see invocation)
*** Error code 1

Stop.
make: stopped in /usr/home/user/testlib

最佳答案

除了将 -shared 添加到链接器阶段(如 Oo.oO 提到的),您可能还想使用 -fPIC 标志进行编译。因此,如果您使用 makefile 隐式规则进行编译(看起来像您一样),那么您可能需要将该标志添加到 CFLAGS 中。我认为您在链接阶段不需要它:

# Makefile TESTLIB

TEST_OBJS = test.o
TEST_HEADERS = test.h
TEST_LIB = test.so

CFLAGS += -fPIC
CC = cc

testlib:    $(TEST_OBJS)
        $(CC) -shared -o $(TEST_LIB) $(TEST_OBJS)

# Rebuilt if this Makefile or header changes
$(TEST_OBJS):   Makefile $(TEST_HEADERS)

关于使用 clang 编译最小测试共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57744895/

相关文章:

c - Matlab编码器: Matlab Array to C Array

makefile - 如何评估一次makefile条件变量?

c++ - 比特币、MinGW、Windows 7、Makefile 错误

在 LLVM 中不使用源文件进行调试

c++ - Lambda、局部类型和全局命名空间

同时为静态库和可执行文件创建 makefile

c - 近似保序霍夫曼代码

c++ - alignas 用于内联静态成员时是否合法?

c - 数字大于 2³² 的按位取模

makefile - 获取编译器警告的摘要