- 主题:主程序与库中都有main函数
代码中有main函数,链接的一个库(静态或动态库)中也有main函数,成功生成了可执行文件,执行时执行的是代码中的main函数,而不是库中的,这个有什么规定吗?为什么链接时不报重复定义main的错呢?
// main.cpp
#include <iostream>
int main()
{
std::cout << "I am main in main program" << std::endl;
return 0;
}
// libaaa.cpp
#include <iostream>
int main()
{
std::cout << "I am main in library" << std::endl;
return 0;
}
// 脚本
export LD_LIBRARY_PATH=.
g++ -fPIC -c libaaa.cpp -o libaaa.o
g++ -shared -o libaaa.so libaaa.o
ar -r libaaa.a libaaa.o
g++ -c main.cpp -o main.o
g++ main.o -L. -laaa -o main_dll
g++ main.o libaaa.a -o main_static
./main_dll
./main_static
最后两个程序执行都输出
I am main in main program
--
FROM 117.107.131.*
本来就可以通过库替换覆盖同名函数。包括glibc的函数。这是个很有用的功能。
【 在 rdsky 的大作中提到: 】
: 代码中有main函数,链接的一个库(静态或动态库)中也有main函数,成功生成了可执行文件,执行时执行的是代码中的main函数,而不是库中的,这个有什么规定吗?为什么链接时不报重复定义main的错呢?
:
: // main.cpp
: ...................
--来自微微水木3.5.14
--
FROM 183.193.17.*
库还有这功能啊!
那链接的时候怎么区分入口函数呢?
动态库文件直接就能被链接成为可执行文件嘛?
看来得试试前面的例子
【 在 foliver 的大作中提到: 】
: 本来就可以通过库替换覆盖同名函数。包括glibc的函数。这是个很有用的功能。
: --来自微微水木3.5.14
--
FROM 223.166.225.*
确实很意外,一直以为由于作用域会引起名字冲突
竟然这也是重载,奇怪的知识又增加了
【 在 ylh0315 的大作中提到: 】
:可以通过库和obj实现函数重载。
- 来自 水木社区APP v3.5.7
--
FROM 140.206.193.*
优先级有规定吗,obj的优先级高于库的吧,如果两个库中有同名函数呢
【 在 ylh0315 的大作中提到: 】
: 每个库可以有一个main,
: 独立的obj也可以有。
: 只有一个最高优先级的可以被链接进入程序。
--
FROM 123.121.160.*
链接的时候,假如处理的当前模块(单元)是a, 发现a里面引用了模块b的B()函数,但没直接/间接引用到b里的main()函数,链接器就没必要去检查b里有没main()函数的吧,这个有开销
-Wl,--verbose这个参数是可以看到整个链接的符号查找过程的
链接应该是从crt*.o开始的,crt*.o引用了main(),这个main()的查找顺序,是按你在命令行里指定的模块顺序的。
--
修改:z16166 FROM 221.218.160.*
FROM 221.218.160.*
程序正确性都不能保证,还谈什么开销
【 在 z16166 的大作中提到: 】
: 有开销,默认不会检测,需要用参数显式打开。
--
FROM 107.204.171.*
Linker默认按模块先后顺序查找引用到的函数,这个顺序是码农提供的,也就是码农保证
在库里面搞一个main(),那是属于蛋疼。即使库里的main()是测试代码,在测试完后也得注释掉。
【 在 BigCarrot 的大作中提到: 】
: 程序正确性都不能保证,还谈什么开销
:
--
修改:z16166 FROM 221.218.160.*
FROM 221.218.160.*