Articles of 编译

与g ++连接时出错

我尝试编译和链接我的应用程序分两步: 编译: g ++ -c -o file1.o file1.cc general_header.h g ++ -c -o file2.o file2.cc general_header.h g ++ -c -o file3.o file3.cc general_header.h 链接: g ++ -o myApp file1.o file2.o file3.o 我收到一个链接错误如下: file1.o:文件无法识别:无法识别文件格式 collect2:ld返回1退出状态 难道我做错了什么 ? 谢谢

这个gcc编译器命令中的-z选项是什么?

命令: gcc -fno-stack-protector -z execstack -o ExitCode ExitCode.c 我知道我需要包含-z execstack来使我的代码正常工作,而且我基本上知道了execstack的作用和允许我做什么。 但是我不知道-z选项在这里做什么。 我已经在gcc和execstack手册页上查找并execstack并且使用了–help ,但是没有find直接的答案。 我猜测这是增加了execstackfunction…?

无法在linux中编译opencv

我一直有麻烦尝试编译使用g ++在Linux中的示例代码为opencv的一些示例,但运行后,我得到这个错误信息: g++ `pkg-config –cflags –libs opencv` hello.cpp -o hello 我得到这个输出: /tmp/ccjvVxLI.o: In function `main': hello.cpp:(.text+0x45): undefined reference to `cvLoadImage' hello.cpp:(.text+0x6b): undefined reference to `cvNamedWindow' hello.cpp:(.text+0x7c): undefined reference to `cvShowImage' hello.cpp:(.text+0x86): undefined reference to `cvWaitKey' hello.cpp:(.text+0x90): undefined reference to `cvDestroyWindow' collect2: ld returned 1 exit status 我在网上查看并检查了我的OpenCV安装,并得到了正常的输出: pkg-config –cflags opencv 如: -I/usr/local/include/opencv -I/usr/local/include 但是当我跑时: pkg-config […]

为什么剥离的二进制文件仍然可以在反汇编的文件中有库调用信息?

testing平台是32位的Linux。 我编译ac程序时不带strip符号信息,并使用objdump来反汇编elf可执行文件。 这是结果的一部分。 804831c: e8 8c fe ff ff call 8048360 <printf@plt> 如果我使用: strip binary 要删除符号信息并使用objdump来反汇编elf可执行文件,我仍然可以看到如下结果: 804831c: e8 8c fe ff ff call 8048360 <printf@plt> 所以我的问题是: 像objdump这样的反汇编工具如何在删除了所有符号信息后知道某些库函数的名字..? 谢谢!

如何在Linux上编译Windows Visual C ++代码

注意:这个问题的目的是为了find在VC中用于Windows的标准开发方式,并且平滑地将代码移植到Linux系统(也就是说,尽可能less地编写代码)到Linux系统上,以便它可以编译成可执行文件并运行。 根据我收到的答案,我可以看到有一个误解。 因此,我打算把这个问题分成两个不同的问题。 一个是我原来的(修改的问题),另一个是我的具体问题,以及如何解决这个问题。 (我将在发布后添加这个问题的链接)。 注意:我对C ++很陌生,并且使用makefile进行编译。 我一直在创build一个在Linux服务器上运行的C ++程序,到目前为止,我一直在使用Visual Studio( Window的当前版本 )来编写所有的代码。 为了安全起见,在我开始编写程序之前,我试图在VC中创build一些基本的C ++文件,将它们转移到我的服务器上,然后用g ++编译并运行可执行文件。 一切都奏效了,所以我想: “嘿,我可以继续写下我的整个程序,按照相同的过程,一切都会好的!” 显然,我错了 ,这就是为什么我在这里。 当我运行我的makefile时,我得到了很多错误,而且我不确定如何处理这种情况。 大量的错误消息似乎暗示我使用vector(当然,这与编译VC时运行良好)。 我看了下面的问题: 如何在Visual Studio 2010 for Linux中进行编译 端口Visual Studio C ++到Linux 在Linux中编译Visual C ++代码? 但是我不能真正find解决我的问题的直接解决scheme(例如,我宁愿避免在Linux平台上安装VC,只是从那里开始工作)。 我也研究过( 并尝试使用 ) wineg ++,但它似乎没有改变任何编译。 我该怎么处理这个问题呢? 含义:在Windows VC上开发然后移植到Linux是否是常见的做法? 如果是这样,是否有一个确保一切顺利的标准方法? 还是仅仅知道你的Linux上的编译器是如何工作和编码的,这样就不会出错? 最好是一个解决scheme,使我可以在Windows上继续开发,并在完成时将所有内容简单地移植到Linux上。 此外,如果可能的话,尽可能简单地做出任何答案,当涉及到大部分这些东西时,我仍然非常非常业余。 编辑:我也想提一下,我没有真的使用任何疯狂的图书馆。 只是math.h和向量 。 一些错误的例子是: 使用一些双精度来初始化vector: 相应的编译错误:

在linux上用c ++标准库编译

您好以下示例代码: func.h – 函数的头文件 #include <vector> #include <tuple> using std::vector; using std::tuple; tuple <double,double> A(vector<int>& n); func.cpp – 函数cpp文件 #include <iostream> #include <vector> #include <tuple> using namespace std; tuple <double,double> A(vector<int>& n) { double a1=n.size(); double a2=a1+0.5; return make_tuple(a1,a2); } main.cpp – 主要的cpp文件 #include <iostream> #include <vector> #include <tuple> #include "func.h" using namespace std; int […]

未定义的引用c ++,不寻常的情况

我正在用c ++创build一个队列类,并且遇到了编译makefile的麻烦。 我的queue.cpp类在这里 #include "queue.h" #include <stdlib.h> queue::queue() { front_p = NULL; back_p = NULL; current_size = 0; } void queue::enqueue(int item) { node newnode = node(item, NULL); if (front_p == NULL) //queue is empty { front_p = &newnode; back_p = &newnode; } else { back_p->next = &newnode; back_p = &newnode; } current_size ++; } […]

如何编译包含多个源文件的项目?

我有一个主代码(.cpp)和其他一些文件(.cpp及其对应的.h文件),其中包含我的主程序中使用的函数。 我想知道如何编译我的文件并运行主代码。

在linux下编译简单的C ++程序(第一次)

我得到一个错误编译一个简单的程序在Linux中使用C + +。 有3个文件: Employee.h , Employee.cpp, and Salary.cpp (main) 。 我在Salary.cpp <iostream>, <fstream>, <string>, <stdio.h>, <stdlib.h>包含了几个系统头文件我唯一的原因是itoa()函数。 我无法把它编译和阅读的地方,“有时是一个先决条件。 我得到的错误是:'Salary.cpp:195:47:错误:itoa没有在此范围内声明 现在,我已经在全球范围内包含头,itoa()只用于我包含的文件,所以我不知道为什么会发生这种情况,除了没有包括正确的系统头。 我是否需要在命令行中指定所有的系统头文件? 我不太确定发生了什么事。 编辑:这里是一些源代码…我只扩大了需要保持简短。 该错误发生在addEmployee()函数附近的底部…我不知道我知道如何把行号。 在创build一个新的Employee()之后, #include "Employee.h" #include <iostream> #include <fstream> #include <string> #include <cstdio> #include <cstdlib> void findEmployees(Employee*[], const short); void addEmployee(Employee*[], short&); unsigned short parseDataFile(Employee* [], short); bool insertEmployee(Employee*[], short, Employee*); int main(int […]

Linux / Mac:编译时确定平台的好方法是什么?

我想概括一个构build系统在几个(有点类似)的平台上编译。 什么是确定运行shell脚本或Makefile的主机types的好方法。 我想区分Mac和Linux, 但也不同的具体分配的Linux (如RHEL,Ubuntu)。 Cygwin对我来说并不重要,但是如果你把它包含在你的回复中,我相信别人会觉得它很有价值。 基本原理可能包括使用主机types来获取和安装正确版本的二进制包,比从源代码编译更方便。 另外,一些商业软件是针对特定发行版本进行二进制打包的,因此部分动机是抓取正确的二进制文件。 谢谢, 那么setjmp