LINUX.ORG.RU

История изменений

Исправление EXL, (текущая версия) :

Следи за руками:

$ cat 1/a.cpp
#include <iostream>

void hello_1(void) {
    std::cout << "Hello 1" << std::endl;
}


$ cat 2/a.cpp
#include <iostream>

void hello_2(void) {
    std::cout << "Hello 2" << std::endl;
}

$ cat b.cpp 
#include "1/a.h"
#include "2/a.h"

int main(void) {
    hello_1();
    hello_2();
    return 0;
}

----------------------------

$ g++ -c 1/a.cpp -o 1/a.o
$ g++ -c 2/a.cpp -o 2/a.o

# First
$ ar rcs lib.a 1/a.o
$ ar rcs lib.a 2/a.o
$ nm lib.a | c++filt | grep "T hello"
0000000000000000 T hello_2()

$ g++ b.cpp lib.a -o b
b.cpp:(.text+0x9) undefined reference to hello_1()

$ rm lib.a

# Second
$ ar rcsP lib.a 1/a.o 
$ ar rcsP lib.a 2/a.o 
$ nm lib.a | c++filt | grep "T hello"
0000000000000000 T hello_1()
0000000000000000 T hello_2()

$ g++ b.cpp lib.a -o b
$ ./b
Hello 1
Hello 2

$ rm lib.a

# Third
$ ar rcs lib.a 1/a.o 2/a.o
$ nm lib.a | c++filt | grep "T hello"
0000000000000000 T hello_1()
0000000000000000 T hello_2()

$ g++ b.cpp lib.a -o b
$ ./b
Hello 1
Hello 2

$ rm lib.a

Исправление EXL, :

Следи за руками:

$ cat 1/a.cpp
#include <iostream>

void hello_1(void) {
    std::cout << "Hello 1" << std::endl;
}


$ cat 2/a.cpp
#include <iostream>

void hello_2(void) {
    std::cout << "Hello 2" << std::endl;
}

$ cat b.cpp 
#include "1/a.h"
#include "2/a.h"

int main(void) {
    hello_1();
    hello_2();
    return 0;
}

----------------------------

$ g++ -c 1/a.cpp -o 1/a.o
$ g++ -c 2/a.cpp -o 2/a.o

# First
$ ar rcs lib.a 1/a.o
$ ar rcs lib.a 2/a.o
$ nm lib.a | c++filt | grep "T hello"
0000000000000000 T hello_2()

$ g++ b.cpp lib.a -o b
# /usr/bin/ld: /tmp/ccbufrnT.o: in function `main':
# b.cpp:(.text+0x9): undefined reference to `hello_1'()
# collect2: error: ld returned 1 exit status

$ rm lib.a

# Second
$ ar rcsP lib.a 1/a.o 
$ ar rcsP lib.a 2/a.o 
$ nm lib.a | c++filt | grep "T hello"
0000000000000000 T hello_1()
0000000000000000 T hello_2()

$ g++ b.cpp lib.a -o b
$ ./b
Hello 1
Hello 2

$ rm lib.a

# Third
$ ar rcs lib.a 1/a.o 2/a.o
$ nm lib.a | c++filt | grep "T hello"
0000000000000000 T hello_1()
0000000000000000 T hello_2()

$ g++ b.cpp lib.a -o b
$ ./b
Hello 1
Hello 2

$ rm lib.a

Исправление EXL, :

Следи за руками:

$ cat 1/a.cpp
#include <iostream>

void hello_1(void) {
    std::cout << "Hello 1" << std::endl;
}


$ cat 2/a.cpp
#include <iostream>

void hello_2(void) {
    std::cout << "Hello 2" << std::endl;
}

$ cat b.cpp 
#include "1/a.h"
#include "2/a.h"

int main(void) {
    hello_1();
    hello_2();
    return 0;
}

----------------------------

$ g++ -c 1/a.cpp -o 1/a.o
$ g++ -c 2/a.cpp -o 2/a.o

# First
$ ar rcs lib.a 1/a.o
$ ar rcs lib.a 2/a.o
$ nm lib.a | c++filt | grep "T hello"
0000000000000000 T hello_2()

$ g++ b.cpp lib.a -o b
/usr/bin/ld: /tmp/ccbufrnT.o: in function main:
b.cpp:(.text+0x9): undefined reference to hello_1()
collect2: error: ld returned 1 exit status

$ rm lib.a

# Second
$ ar rcsP lib.a 1/a.o 
$ ar rcsP lib.a 2/a.o 
$ nm lib.a | c++filt | grep "T hello"
0000000000000000 T hello_1()
0000000000000000 T hello_2()

$ g++ b.cpp lib.a -o b
$ ./b
Hello 1
Hello 2

$ rm lib.a

# Third
$ ar rcs lib.a 1/a.o 2/a.o
$ nm lib.a | c++filt | grep "T hello"
0000000000000000 T hello_1()
0000000000000000 T hello_2()

$ g++ b.cpp lib.a -o b
$ ./b
Hello 1
Hello 2

$ rm lib.a

Исправление EXL, :

Следи за руками:

$ cat 1/a.cpp
#include <iostream>

void hello_1(void) {
    std::cout << "Hello 1" << std::endl;
}


$ cat 2/a.cpp
#include <iostream>

void hello_2(void) {
    std::cout << "Hello 2" << std::endl;
}

$ cat b.cpp 
#include "1/a.h"
#include "2/a.h"

int main(void) {
    hello_1();
    hello_2();
    return 0;
}

----------------------------

$ g++ -c 1/a.cpp -o 1/a.o
$ g++ -c 2/a.cpp -o 2/a.o

# First
$ ar rcs lib.a 1/a.o
$ ar rcs lib.a 2/a.o
$ nm lib.a | c++filt | grep "T hello"
0000000000000000 T hello_2()

$ g++ b.cpp lib.a -o b
/usr/bin/ld: /tmp/ccbufrnT.o: in function `main':
b.cpp:(.text+0x9): undefined reference to `hello_1()'
collect2: error: ld returned 1 exit status

$ rm lib.a

# Second
$ ar rcsP lib.a 1/a.o 
$ ar rcsP lib.a 2/a.o 
$ nm lib.a | c++filt | grep "T hello"
0000000000000000 T hello_1()
0000000000000000 T hello_2()

$ g++ b.cpp lib.a -o b
$ ./b
Hello 1
Hello 2

$ rm lib.a

# Third
$ ar rcs lib.a 1/a.o 2/a.o
$ nm lib.a | c++filt | grep "T hello"
0000000000000000 T hello_1()
0000000000000000 T hello_2()

$ g++ b.cpp lib.a -o b
$ ./b
Hello 1
Hello 2

$ rm lib.a

Исходная версия EXL, :

Следи за руками:

$ cat 1/a.cpp
#include <iostream>

void hello_1(void) {
    std::cout << "Hello 1" << std::endl;
}


$ cat 2/a.cpp
#include <iostream>

void hello_2(void) {
    std::cout << "Hello 2" << std::endl;
}

$ cat b.cpp 
#include "1/a.h"
#include "2/a.h"

int main(void) {
    hello_1();
    hello_2();
    return 0;
}

----------------------------

$ g++ -c 1/a.cpp -o 1/a.o
$ g++ -c 2/a.cpp -o 2/a.o

# First
$ ar rcs lib.a 1/a.o
$ ar rcs lib.a 2/a.o
$ nm lib.a | c++filt | grep "T hello"
0000000000000000 T hello_2()

$ g++ b.cpp lib.a -o b
/usr/bin/ld: /tmp/ccbufrnT.o: in function `main':
b.cpp:(.text+0x9): undefined reference to `hello_1()'
collect2: error: ld returned 1 exit status

$ rm lib.a

# Second
$ ar rcsP lib.a 1/a.o 
$ ar rcsP lib.a 2/a.o 
$ nm lib.a | c++filt | grep "T hello"
0000000000000000 T hello_1()
0000000000000000 T hello_2()

$ g++ b.cpp lib.a -o b
$ ./b
Hello 1
Hello 2

$ rm lib.a

# Third
$ ar rcs lib.a 1/a.o 2/a.o
$ nm lib.a | c++filt | grep "T hello"
0000000000000000 T hello_1()
0000000000000000 T hello_2()

$ g++ b.cpp lib.a -o b
$ ./b
Hello 1
Hello 2

$ rm lib.a