gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:36:55 27 4
gpt4 key购买 nike

我正在尝试使用以下方法在 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com