2016-04-14 26 views
0

Birkaç gün önce yaptığım küçük bir testi yeniden oluşturmaya çalıştım ve kod o zamankiyle aynı olmasa da, benzer şekilde çalışıyor. Bağlayıcının nasıl çalıştığını biliyorum ve herşeyi yok sayar, bir dosyaya bağlanma zamanında kullanılmaz. Bende test.cpp, test2.cpp, test.h, test2.h ve main.cpp var.Bağlantı sırasını dikkate almadan kaynakları nasıl bağlarım?

Test.h

#ifndef TEST_H 
#define TEST_H 

void Test(void); 
void TestTestTest(void); 

#endif /* TEST_H */ 

test2.h

#ifndef TEST2_H 
#define TEST2_H 

void TestTest(void); 

#endif /* TEST2_H */ 

test.cpp

#include <test.h> 
#include <test2.h> 
#include <iostream> 

void Test(void) 
{ 
    std::cout << "Test" << std::endl; 
} 

void TestTestTest(void) 
{ 
    TestTest(); 
    std::cout << "TestTestTest" << std::endl; 
} 

test2.cpp

#include <test2.h> 
#include <test.h> 
#include <iostream> 

void TestTest(void) 
{ 
    Test(); 
    std::cout << "TestTest" << std::endl; 
} 

main.cpp

#include <test.h> 

int main(int argc, char* argv[]) 
{ 
    TestTestTest(); 
    return 0; 
} 

Ve bağlama düzeni: main.o test.o test2.o

Ben test.o bağlarken fonksiyon Testi için kaynak göz ardı edileceği, biliyorum ama TestTestTest olacak göz ardı edilmemelidir, çünkü testTestTest'i kullanan main.cpp'de bir işlev çağrısı vardır. Test2.o bağlanırken TestTest, TestTestTest işlevinde kullanıldığından göz ardı edilmeyecektir. Ancak TestTest'in daha önce yok sayılan Test fonksiyonuna bir fonksiyon çağrısı vardır, bu yüzden bir hata mesajı alıyorum.

Bunun için herhangi bir yolu var mıdır, bu yüzden, sipariş, daha çılgın değildir, ya da tüm işlevler kaynağını alır ve sonunda keser, neye ihtiyaç yoktur?

Paylaşılan kitaplıkları derlerken kullanılan -fPIC bağlantı seçeneği duydum. Ama nedense, main.cpp dışındaki tüm kaynakları derlediğimde ve bunları paylaşılan bir kütüphanede birbirine bağladığımda ve bu kütüphaneyi main.o'ya bağladığımda, Windows, uygulamayı çalıştırılamayacağını, ancak Bir sorun, problem var mı. Ve anlamıyorum, neden bu oluyor.

Kodumu oluşturmak için g ++ kullandım.

Kaynağı bu şekilde oluşturmak mümkün mü ve eğer mümkünse, neyi yanlış yapıyorum? Paylaşılan kütüphaneleri oluştururken aklımda tutmam gereken bir şey var mı? Kullanmak istediğiniz her işlevi ile Windows paylaşımlı kütüphaneleri yaratırken

__declspec(dllexport) 

:

+0

Bkz. Http://stackoverflow.com/questions/4802624/linking-libraries-that-contains-circular-refrences-in-gcc – AtnNn

+0

Teşekkürler, bu bana gerçekten yardımcı oldu. Birden çok kez kütüphaneleri kullanabileceğimi bilemedim, her zaman düşündüm ki, bir hata olacaktı çünkü fonksiyon daha sonra birden çok kez tanımlanmış olurdu. Ama görünüşe göre, durum böyle değil. – JPKing64

cevap

0

özelliğini kullanmayı deneyin. Örnek test.h için

:

#ifndef TEST_H 
#define TEST_H 

void __declspec(dllexport) Test(void); 
void __declspec(dllexport) TestTestTest(void); 

#endif /* TEST_H */ 

this bakınız.

+0

Tamam, teşekkürler, daha sonra deneyeceğim. – JPKing64

İlgili konular