私は数日前にやった小さなテストを再現しようとしましたが、そのコードは当時と同じではありませんが、同様の仕方で動作します。私はリンカの仕組みを知っていて、ファイルをリンクするときには使用されていないすべてを無視します。だから、私はtest.cpp、test2.cpp、test.h、test2.hとmain.cppを持っています。リンクオーダーを無視してソースをリンクするにはどうすればよいですか?
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;
}
そして、リンク順序:main.o test.o test2.o
私はtest.oをリンクしながら、機能テストのためのソースが無視されることを、知っているが、TestTestTest意志Test.cssにTestTestTestを使用する関数呼び出しがあるため、無視しないでください。 test2.oをリンクすると、TestTestは関数TestTestTestで使用されるため、無視されません。しかし、TestTestは以前に無視された関数Testへの関数呼び出しを持っているので、エラーメッセージが出ます。
これは、順序が狂っていないか、すべての関数のソースを取り、最後に不要なものがあるかどうかを調べる方法はありますか?
共有ライブラリをコンパイルするときに使用されるリンカオプション-fPICについて聞いたことがあります。しかし何らかの理由で、main.cpp以外のすべてのソースをコンパイルし、それらを共用ライブラリにリンクし、そのライブラリをmain.oにリンクすると、アプリケーションは実行できません。何の問題。そして、私は理解していない、なぜこれが起こっている。
g ++を使用してコードを作成しました。
この方法でソースを構築することは可能でしょうか、可能であれば、何が間違っていますか?共有ライブラリを構築する際に、私が心に留めなければならないことは何ですか?あなたが使用したいすべての機能をWindowsで共有ライブラリを作成中
__declspec(dllexport)
:
http://stackoverflow.com/questions/4802624/linking-libraries-that-contains-circular-refrences-in-gcc – AtnNn
ありがとう、本当に助けてくれました。私はライブラリを複数回使用できることを知らなかった、私はいつも、関数が複数回定義されていたのでエラーがあると思っていた。しかし、一言で言えば、それはそうではありません。 – JPKing64