我在使用 c++ 在 linux 中使用 clang 时链接标准 crt 时遇到问题



我正在努力将Windows项目移植到Linux,所以我正在尝试在linux(ubuntu)上学习/设置我的构建管道。我在 Windows 上使用 clang 并希望使用 clang/llvm 在 ubuntu 上编译我的代码,但我在将 c 运行时库链接到我的代码时遇到了问题。这是我尝试运行的示例,以便我可以设置构建脚本,

// -- system includes
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// -- my includes
#include "crt.h"
int main() {
char title[] = "Text";
int title_length = strlen(title);
// -- sending string and length to platform dependent code
CreateBox(title, title_length);
return(0); }

在 Ubuntu 3.4 LTS 上安装 clang 14.04 后,我从终端运行上述代码以及平台相关代码,

clang++ -c main.cpp box_linux.cpp

文件编译时没有错误。假设我在尝试链接时使用以下命令,

ld main.o box.o

我每次都得到以下错误,

ld: warning: cannot find entry symbol _start; defaulting to 00000000004000b0
In function 'main':
(.text+0x30): undefined reference to 'strlen'

我尝试链接libc ++,libstdc++,但似乎没有任何效果。诚然,我对linux非常非常陌生,并且在linux上叮当,所以我提前道歉。我已经在stackoveflow以及ubuntu的论坛和LLVM的论坛/文档中检查了不同的问题,但无济于事。如果有人能指出我正确的方向,将不胜感激。

如果您在 Linux 上使用 clang(或 gcc),则不必自己进行链接。您可以让clang为您进行链接,它将为您的系统选择必要的库,只需删除-c标志表单命令行或使用clang main.o即可。Clang 了解.o文件已经是目标文件,并将其传递给链接器。

如果您真的想自己调用ld,请从 clang++ -v main.cpp 开始。-v开关让 clang 打印ld的调用命令,例如,如下所示:

/usr/bin/ld" -z relro --hash-style=gnu --build-id --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o a.out /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.8/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/4.8 -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu -L/lib/x86_64-linux-gnu -L/lib/../lib64 -L/usr/lib/x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../.. -L/data/home/user/bin/../lib -L/lib -L/usr/lib /tmp/test-574b88.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/4.8/crtend.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o

在我的 Ubuntu 14.04 LTS 上。