Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ &引用;“无主”字样;用于在C+中链接或执行的函数+;_C++_Linux_Macos_Compilation - Fatal编程技术网

C++ &引用;“无主”字样;用于在C+中链接或执行的函数+;

C++ &引用;“无主”字样;用于在C+中链接或执行的函数+;,c++,linux,macos,compilation,C++,Linux,Macos,Compilation,我正在尝试编译一个函数(不称为main),它可以集成到另一个代码中或直接执行(链接后) 我在我的mac电脑上试用了一下,效果很好。 我终于在Linux(CentOS和ubuntu)上测试了它。然而,在Linux上,这项任务看起来像预期的那样困难 源代码如下(只是为了解释问题) test.cpp: #include <cstdio> #ifdef __cplusplus extern "C" { #endif int test(int argc, char const *a

我正在尝试编译一个函数(不称为main),它可以集成到另一个代码中或直接执行(链接后)

我在我的mac电脑上试用了一下,效果很好。 我终于在Linux(CentOS和ubuntu)上测试了它。然而,在Linux上,这项任务看起来像预期的那样困难

源代码如下(只是为了解释问题)

test.cpp:

#include <cstdio>

#ifdef __cplusplus 
extern "C" {
#endif
    int test(int argc, char const *argv[]);
#ifdef __cplusplus
}
#endif

int test(int argc, char const *argv[]) {
    fprintf(stderr, "%s\n", "test");
    return 0;
}
在Linux上

g++ -c test.cpp -o test.o && g++ test.o -o test -e test
我在我的MacOS上试用了clang、g++和Intel编译器,这三个都可以正常工作

我尝试在Linux上使用g++和英特尔编译器,总是出现相同的错误

usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status
任何关于我做错了什么或遗漏了什么的建议、解释或解决方案都会非常有用。 谢谢

编辑:

目前,我有一个“定义”来创建一个main,但是如果我们有很多函数,我们有义务每次编译两个(一个用于函数版本,一个用于执行),最后使代码更重

就像本主题中讨论的一样

为了不做XY,我从一堆小程序中继承了一个XY,我想把它们放在一起收集,这样更容易使用(用于远程执行…)。然而,如果需要,每一个都需要能够独立执行,以便调试,。。。在使用“execv”和将每个main转换为函数之间,我犹豫不决。我可能会选择坏的

编辑: 最终目标是能够有独立的程序。但我们也可以从外部软件调用

解决方案: 解决方案看起来是,通过dlopen调用main,您无法做到这一点(即使它在MacOSX上似乎可以工作,但它是特定于实现的,并且是安全的)

Linux正在做比你想象的更复杂的事情

C标准(例如C11)要求托管实现的
main
功能(§5.1.2.2.1):

程序启动时调用的函数名为
main
。实现没有声明此函数的原型

和C++标准也强烈要求在代码> >主< /代码>运行之前和返回后完成一些处理(例如静态数据的构造)(并且在Linux上各种CRT0技巧正在实现该特性)。 如果你想了解血腥的细节(这并不容易!),请研究crt0实现的源代码和(自由软件)源代码

我试图编译一个可以集成到其他代码中的函数(不称为main)

也请阅读

库出现问题,无法执行,不是吗

我不明白那是什么意思。您当然可以加载一个插件,然后从主程序
dlopen
-ing中运行插件内部的代码

(在Linux上,一些库,如
libc.so
甚至是专门构建的,也可以作为可执行文件使用;我不建议您在自己的代码中使用这种做法)

你可能需要几天的时间来阅读德雷珀的书(但这是高级的东西)


如果您想在运行时添加一些代码,请阅读和

最终目标是能够有独立的程序。但我们也可以从外部软件调用

你不能那样做(这毫无意义)。但是,您可以使用诸如-s和许多其他的约定与其他正在运行的程序进行通信(即)。先阅读,然后再编码。同时阅读

解决方案看起来是,通过dlopen调用main

<> >通过<代码> > dLOpen> <代码> >代码> dLSym < /C> >,C++标准禁止(不允许使用指针>代码>主< /代码>)。
main
函数具有非常特定的状态和角色(并且是专门编译的;编译器知道
main


(也许调用由
dlsym
获得的
main
在某些Linux系统上似乎是可行的,但这肯定是未定义的行为,因此您不应该这样做)

为什么要问?请编辑你的问题以激发它。我不理解你的编辑。为什么你要做两次编译?哪一个?为什么这很重要?闻起来很像@MathieuGravey:请编辑你的问题,不要评论。但是为什么你不能有图书馆呢?闻起来很像XY的问题。您想解决的原始问题是什么?最新的编辑使您的问题更加混乱。你真的应该解释你想要解决的原始问题。我们猜不出你的动机。为什么插件和共享库不令人满意?@MathieuGravey:在编写一行代码之前,至少花一周时间阅读材料。你看起来很困惑,缺乏基本的知识。谢谢,非常感谢所有这些链接(你添加它们的速度比我读的快)。但毫无疑问,这是解决我问题的办法。我不知道我们能做到。@MathieuGravey:你不能编辑你自己的问题来添加实际的动机(你没有告诉我)。请这样做
usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status