gcc的编译选项有顺序吗?

问题描述

gcc的编译选项有顺序吗?
我在写一个测试动态链接库的时候,碰到一个问题。比如,现在我的目录是这个样子的:
.
├── libtest.so
├── main.c
├── main.o
├── test.c
└── test.h

main.c
#include
#include ""test.h""

int main()
{
print_hello();

return 0;
}

其中,libtest.so是test.c和test.h编译出来的动态链接库。然后我需要再main.c中引用这个库,main.o是已经编译
出来的对象,然后我用了下面的语句:
gcc -L. -ltest -o main main.o
但是报错:main.o: In function main':
main.c:(.text+0x7): undefined reference to
print_hello'
collect2: error: ld returned 1 exit status

print_hello是libtest.so提供的接口,为什么会找不到呢?明明已经链接了。
于是,我换了一下gcc的编译选项的顺序,这样写:
gcc main.o -o main -L. -ltest
把链接libtest.so放在后面就可以了,难道gcc的编译选项是有顺序要求的吗?
官方也没有说这些啊,网上也没有相关的问题

解决方案

会有一些顺序,可以看官方文档

解决方案二:
有顺序,上层的要放在前面,越靠底层越往后放

时间: 2024-11-18 10:05:22

gcc的编译选项有顺序吗?的相关文章

MySQL编译选项 -fno-strict-aliasing随手记

最近发布的MySQL8.0.2版本中,将gcc的编译选项从--fno-strict-aliasing移除,也就是说打开strict aliasing, 根据worklog #10344 的描述,在单线程的性能测试中,有最多%4的性能提升,还是相当可观的.这个flag在我们内部编译版本中也是一直打开的,但一直不知甚解.本文是网上搜索文档和自己试验的小结. 首先strict aliasing是个什么鬼? --fno-strict-aliasing对应的是--f-strict-aliasing,GCC

gcc用于linux系统下编程的编译器选项说明

GC++(GNU Compiler Collection,GNU编译器套装),是一套由 GNU 开发的编程语言编译器.它是一套&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp; GNU编译器套装以 GPL 及 LGPL 许可证所发行的自由软件,也是 GNU计划的关键部分,亦是自由的类Unix及苹果电脑 Mac OS X 操作系统的标准编译器. GCC 原名为 GNU C 语言编译器,因为它原本只能处理 C语言.GCC

《逆向工程权威指南》—第3章3.节x86

第3章 Hello,world!逆向工程权威指南现在,我们开始演示<C语言编程>一书[1]中著名的程序: #include <stdio.h> int main() { printf("hello, world\n"); return 0; }; 3.1 x863.1.1 MSVC接下来我们将通过下述指令,使用MSVC 2010编译下面这个程序. cl 1.cpp /Fa1.asm其中/Fa选项将使编译器生成汇编指令清单文件(assembly listing f

C语言输出DEBUG调试信息的方法

问题提出 我们在调试程序时,输出调试信息(又称为"打桩"或者"插桩")是一种普遍.有效的方法. 我们输出的信息通常包括行号.函数名.程序变量等. 但是我们在程序BUG修复后,又会特别烦我们之间插入的哪些调试语句,客户是不会理解我们那些调试语句曾经又多少汗马功劳,而太多的调试语句也影响我们程序运行时输出的美观和清晰,于是很多情况下我们需要手动将那些调试语句注释掉或者删掉,这对于小项目来说,我们还可以忍受,但是对于大项目,如果我们还是手动删除,我们只能....呵呵,这不

Linux系统(X64)安装Oracle11g完整安装图文教程另附基本操作_oracle

一.修改操作系统核心参数 在Root用户下执行以下步骤: 1)修改用户的SHELL的限制,修改/etc/security/limits.conf文件 输入命令:vi /etc/security/limits.conf,按i键进入编辑模式,将下列内容加入该文件. oracle soft nproc 2047 oracle hard nproc 16384 oracle soft nofile 1024 oracle hard nofile 65536 编辑完成后按Esc键,输入":wq"

让C/C++程序一次编译可以发布到多版本Linux之上

最近页游开放平台比较多, 每个平台要求的Linux版本各不相同, 这给开发人员部署服务器带来了很大的困难. 在本机Linux编译的程序,发布时即便将依赖的so附带到目标Linux环境,仍然会碰到依赖及版本问题,例如: [root@localhost bin]# ldd wkcenter ./wkcenter: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by ./wkcenter)./wkcenter

Makefile 自动生成依赖

虽然以前对Makefile有个基本概念,但是真正到自己去写一个哪怕是简单的Makefile时也会遇到不少的麻烦.    现在我有如下文件 dList.h dList.c memory.c debug.c debug.h test.c aaron.h 其中包含关系如下:    aaron.h-->dList.h debug.h    dList.c-->aaron.h    debug.c-->aaron.h    test.c-->aaron.h    memory.c-->

Linux下C程序的编辑,编译和运行以及调试

国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送)国内私募机构九鼎控股打造,九鼎投资是在全国股份转让系统挂牌的公众公司,股票代码为430719,为"中国PE第一股",市值超1000亿元.  -----------------------------------------------------------------------------

gcc编译选项总结

常用编译选项 [plain] view plain copy print? #--------------------------------------------------------------------------------   [介绍]       gcc and g++分别是gnu的c & c++编译器 gcc/g++在执行编译工作的时候,总共需要4步       1.预处理,生成.i的文件[预处理器cpp]    2.将预处理后的文件不转换成汇编语言,生成文件.s[编译器eg