g++ 使用外部目录中的目标文件

g++ using a object file in external directory

上下文:

我目前正在学习 c/c++ 在我的 raspberry pi b+ 模型上进行编译(上周开始),但是在目标文件中使用头文件时遇到问题。


文件位置:

main.cpp-~/src/c++/projects/web_server

http_socket.o - ~/src/c++/web


g++ g++ -o webserver ~/src/c++/web/http_socket.o -std=c++0x main.cpp

的输出

main.cpp:3:25: 致命错误: http_socket.h: 没有那个文件或目录 编译终止。


main.cpp

#include "http_socket.h"

int main() { return 0; }

http_socket.cpp

#include "http_socket.h"
#include <string>

using namespace std;

http_responce::http_responce(string status_Code, string date, string server, string content_Type, string content_Length) {
Status_Code = status_Code;
Date = date;
Server = server;
Content_Type = content_Type;
Content_Length = content_Length;
}

http_socket.h

#ifndef HTTP_SOCKET_H
#define HTTP_SOCKET_H

#include <string>

using namespace std;

class http_responce 
{
    public:
    string Status_Code;
    string Date;
    string Server;
    string Content_Type;
    string Content_Length;

    http_responce(string status_Code, string date, string server, string content_Type, string content_Length);

    private:

    protected:
};

#endif

补充说明:

我是这门语言的新手,习惯使用IDE,所以如果有什么非常琐碎的地方我错过了,请原谅我。

尝试将 http_socket.h 文件放在您要编译的目录中。这应该是最简单的解决方案。 基本上发生的事情是编译器找不到您指定的头文件。

参考:

What is the difference between #include <filename> and #include "filename"?

就像你告诉g++在哪里可以找到http_socket.o目标文件一样,你需要帮助它并告诉它在哪里可以找到你的http_socket.h头文件包括来自 main.cpp。您可以通过将 -I 预处理器选项传递给 g++ 以及包含 http_socket.h.

的目录来执行此操作

假设 http_socket.hhttp_socket.o 位于同一文件夹中,您将使用 -I ~/src/c++/web 以便构建 webserver 的完整命令行如下:

g++ -I ~/src/c++/web -o webserver ~/src/c++/web/http_socket.o -std=c++0x main.cpp

来自 GCC documentation:

-I dir

Add the directory dir to the list of directories to be searched for header files. Directories named by -I are searched before the standard system include directories. If the directory dir is a standard system include directory, the option is ignored to ensure that the default search order for system directories and the special treatment of system headers are not defeated . If dir begins with =, then the = will be replaced by the sysroot prefix; see --sysroot and -isysroot.