C++11 I';在linux和c+中使用clang时,我在链接标准crt时遇到问题+;

C++11 I';在linux和c+中使用clang时,我在链接标准crt时遇到问题+;,c++11,linker,clang,llvm,crt,C++11,Linker,Clang,Llvm,Crt,我正在将一个windows项目移植到linux,所以我正在尝试学习/设置我在linux(ubuntu)上的构建管道。我在windows上使用clang,并希望使用clang/llvm在ubuntu上编译我的代码,但我在将c运行时库链接到我的代码时遇到了一个问题。下面是一个我试图运行的示例,以便设置构建脚本 // -- system includes #include <stdio.h> #include <stdlib.h> #include <string.h&g

我正在将一个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); }
该文件编译无误。假设我在尝试链接时使用了以下命令

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非常、非常陌生,所以我提前道歉。我在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上

如果您在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上

如果您在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上

如果您在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上

感谢您的快速回复!我应该再加一份文件,或者至少提一提。那是我的错误。因为我试图使我的代码独立于平台,所以我的入口点是调用一个公共文件,该文件处理所有与平台无关的函数(I/o、Graphics等)。据我所知,clang和gcc将自动链接单个文件,但您必须对多个文件进行链接。我尝试使用-v选项,但它仍然错误地说“找不到/tmp/string-48040e.o:没有这样的文件或目录”。@EditedContent请编辑您的问题以反映您正在尝试的操作。只需使用类似“clang-o prog main.o file1.o file2.o…”的内容。感谢您的快速响应!我应该再加一份文件,或者至少提一提。那是我的错误。因为我试图使我的代码独立于平台,所以我的入口点是调用一个公共文件,该文件处理所有与平台无关的函数(I/o、Graphics等)。据我所知,clang和gcc将自动链接单个文件,但您必须对多个文件进行链接。我尝试使用-v选项,但它仍然错误地说“找不到/tmp/string-48040e.o:没有这样的文件或目录”。@EditedContent请编辑您的问题以反映您正在尝试的操作。只需使用类似“clang-o prog main.o file1.o file2.o…”的内容。感谢您的快速响应!我应该再加一份文件,或者至少提一提。那是我的错误。因为我试图使我的代码独立于平台,所以我的入口点是调用一个公共文件,该文件处理所有与平台无关的函数(I/o、Graphics等)。据我所知,clang和gcc将自动链接单个文件,但您必须对多个文件进行链接。我尝试使用-v选项,但它仍然错误地说“找不到/tmp/string-48040e.o:没有这样的文件或目录”。@EditedContent请编辑您的问题以反映您正在尝试的操作。只需使用类似“clang-o prog main.o file1.o file2.o…”的内容。感谢您的快速响应!我应该再加一份文件,或者至少提一提。那是我的错误。因为我试图使我的代码平台独立,所以我有我的入口点调用