g++ 编译 c++ 程序时需要包括 include .h 文件,还是需要 .cpp 文件

本文围绕g++编译C++程序时文件包含问题展开。作者用Eclipse下的cdt学习C++,发现多数情况下main.cpp只需包含.h文件,编译时指定.cpp文件即可。但编译类模板代码时,只包含.h文件会报错,替换为.cpp文件可解决,还给出相关参考文章及提及VC常用方法。
g++ 编译 c++ 程序时需要包括 include .h 文件,还是需要 .cpp 文件

最近用Eclipse 下的cdt 学习c++
发现大部分的时候 main.cpp 中只需要包括 .h文件就可以了
cpp 文件在编译的时候用 g++ main.cpp *.cpp *.cpp 指定就可以。


可是今天上午编译一个 自己写的 类模板的代码 stack.h 和 stack.cpp ,main.cpp 中如果只包括 stack.h
就会出现: undefined reference to xxxxxx
的错误,很奇怪。

解决上面的错误只需要把stack.h 替换成stack.cpp就可以了。
这是为什么呢?
幸好参考 这篇文章的时候解决了上面的问题。
ChinaUnix.net - C/C++ 编译器和调试器以及静态库、动态库使用汇总
http://dummy.linux.net.cn/~xgwu/cmuo/basics/cbsource3.html
http://www.linuxsir.com/bbs/showthread.php?s=&threadid=1005

<!--StartFragment --> 再来一片makefile然后细细看

VC中的一些常用方法(20条)
### 使用 `g++` 编译 C++ 文件并包含本地头文件 要使用 `g++` 编译一个 `.cpp` 文件,并包含本地的头文件(`.h`),可以通过 `-I` 参数指定头文件所在的目录。以下是详细的说明和脚本示例。 #### 基础命令结构 假设有一个名为 `main.cpp` 的源文件,以及位于当前目录下的头文件 `myheader.h`,可以使用以下命令来编译: ```bash g++ main.cpp -o myprogram -I. ``` - `-I.` 表示告诉编译器在当前目录 (`.`) 中查找头文件[^1]。 - 如果头文件不在当前目录,则可以用绝对路径或相对路径替换`.`,例如 `-I/path/to/include` 或者 `-I../include`。 #### 更复杂的场景 如果项目中有多个源文件和头文件分布在不同的子目录中,可以扩展命令如下: ```bash g++ source/main.cpp source/utils.cpp -o myprogram -I./headers ``` 这里假定: - 源文件分别存放在 `source/` 目录下, - 头文件存放在 `headers/` 目录下。 #### 自动化构建:Makefile 示例 为了简化多次编译的过程,通常会创建一个 Makefile 来管理依赖关系和编译规则。下面是一个简单的 Makefile 示例: ```makefile CC = g++ CFLAGS = -Wall -I./headers SOURCES = source/main.cpp source/utils.cpp OBJECTS = $(SOURCES:.cpp=.o) EXECUTABLE = myprogram all: $(EXECUTABLE) $(EXECUTABLE): $(OBJECTS) $(CC) $(OBJECTS) -o $(EXECUTABLE) %.o: %.cpp $(CC) -c $< $(CFLAGS) -o $@ clean: rm -f *.o $(EXECUTABLE) ``` - `CC`: 设置使用的编译器为 `g++`。 - `CFLAGS`: 添加警告标志 `-Wall` 和头文件路径 `-I./headers`[^2]。 - `SOURCES`: 列出所有的源文件。 - `OBJECTS`: 自动生成对象文件名列表。 - `EXECUTABLE`: 定义最终生成的可执行文件名称。 运行 `make` 即可自动完成编译工作;运行 `make clean` 可清理生成的临时文件。 #### 动态库支持 如果有需求将部分功能封装成动态库供其他程序调用,也可以利用 `g++` 创建共享库 (shared library)。例如: ```bash g++ -shared -fPIC headers/mymodule.cpp -o libmymodule.so ``` 此命令中的参数解释: - `-shared`: 指明生成的是共享库而非普通可执行文件[^3]。 - `-fPIC`: 生成位置无关代码(Position Independent Code),这是构建共享库所必需的。 之后,在另一个项目的编译过程中可通过链接该共享库实现模块重用: ```bash g++ main.cpp -L. -lmymodule -o final_program -I./headers ``` 其中: - `-L.`: 指定库文件所在的位置; - `-lmymodule`: 链接名为 `libmymodule.so` 的共享库[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值