从system()调用G++会返回一个错误
Calling G++ from system() returns an error
我正在用C++编写一个简单的transiler,它接受Brainfuck代码并将其转换为C++。然后它应该用G++编译,代码如下:
std::string compileCommand{ "g++ file.cpp -o file" };
system(compileCommand.c_str());
但当我运行程序时,G++会产生以下错误:
c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../libmingw32.a(main.o):(.text.startup+0xa0): undefined reference to `WinMain@16'
collect2.exe: error: ld returned 1 exit status
然而,当我跑步时。。。
g++ file.cpp -o file
从程序外部看,它编译得很好。为什么会发生这种情况,我该如何解决?
file.cpp:
#include <iostream>
#include <stdio.h>
int main(int argc, char *argv[])
{
char *ptr = new char[30000]{ 0 };
++*ptr;
++*ptr;
putchar(*ptr)
}
我无法完全复制您的场景,但我认为库路径可能存在一些问题,正如Michael Doubez在评论中提到的那样。由于这个案例看起来是特定于环境的,我认为不会有这样的封闭形式/通用解决方案。如果链接器出现预期的问题,以下序列应该可以正常工作-
-
由于程序在命令行上编译良好,您应该尝试运行
g++ file.cpp -Wl,--verbose -o file
以查看默认情况下为链接器设置了哪些标志。具体来说,命令输出的
SEARCH_DIR
字段(将有多个字段)将有一个目录列表,链接器将在其中搜索库引用。 -
记下上面步骤中的那些目录路径,并使用"-L"标志示例-将这些路径传递给
compileCommand
变量std::string compileCommand{ "g++ file.cpp -o file -L <path1> -L <path2> -L <path3>" };
其中
<path1>
、<path2>
、<path3>
。。。被替换为您在步骤1中找到的路径。在这里,我们特别传递链接器应该在其中查找库的文件夹路径。 -
如果以上步骤不能解决问题,我们必须手动将库名称指定给
compileCommand
。要知道库名称,请运行以下命令-g++ file.cpp -o file -Wl,--trace
库的名称将以"-l"开头,例如-lsdc++、-lgcc_s等。记下这些名称,并将它们作为除步骤2中传递的标志之外的标志传递。你的
compileCommand
变量应该是这样的-std::string compileCommand{ "g++ file.cpp -o file -L <path1> -L <path2> -L <path3> -lstdc++ -lgcc_s" };
如果我们认为这是一个链接器问题的假设是正确的,那么这个序列通常应该可以解决您的问题。
相关文章:
- C++,class,一个返回对象的函数
- C++ 这里有一个返回 (24) 的布尔返回类型函数
- 我有一个返回字符串向量的函数.它需要两个字符串,并且返回一个字符串中缺少的字符串
- 两个相同的重载运算符[]一个返回引用
- 给定一个整数 N>0,区间 [0, 2^N) 中有多少个整数正好有 N-1 个设置位?编写一个返回正确答案的简短函数
- 为什么要定义一个返回结构的 lambda 函数,而不是直接定义结构
- 有没有办法重写一个返回指向 istringstream 的指针的函数,而不是返回一个引用?
- 提升:创建一个返回变体的函数
- C++重载运算符两次,一个返回非常量引用,另一个返回常量引用,首选项是什么
- 我是否应该将最后一个“返回”语句封装为“else { return .. }',如果它在逻辑上是可选的
- 野牛解析器:创建一个返回令牌的函数
- 为什么 C++ 数组的大小不能有一个返回常量的函数调用
- 如何创建一个返回传递的参数名称的函数
- 如何在C++中创建一个返回字节数组的函数?Arduino项目
- 将返回的指针分配给另一个返回的指针
- 如何声明一个返回类型是推导出来的函数
- Constexpr语言 - 为什么只是一个返回语句
- 如何创建一个返回护士函数的函数
- 如何用C包装一个返回智能指针的C++函数
- 如何使用两个函数,一个返回迭代器,另一个返回const_iterator