我現在有點困惑。昨天我有未定義的符號,即使我用g ++的-rdynamic。但是現在我沒有任何錯誤,這更令人不安。使用共享對象中的應用程序的對象
爲了解釋一下我的情況,我想做一些類似於共享對象的插件。我還沒有決定哪個是最好的方法。
A)我的共享對象都有一個稱爲寄存器的函數,它將被一個參數調用。這將是一個插件管理器。
B)我的共享對象將定義一個類,並將在加載時創建該類的實例。在該類的構造函數中,它將嘗試從應用程序獲取靜態單例並自動註冊。
據我所知,迄今爲止我的第一次嘗試並不是那麼棒。
的main.cpp
#include "main.hpp"
#include <iostream>
#include <cstdio>
#include <dlfcn.h>
int S::shared = 0;
int main(int argc, char** argv){
std::cout << "In main -> " << S::shared << "\n";
void* triangle = dlopen("./libtwo.so", RTLD_LAZY);
if(triangle == NULL){
std::cout << "Error while loading so file\n" << dlerror() << "\n";
}
std::cout << "In main -> " << S::shared << "\n" << triangle;
return 0;
}
main.hpp
class S {
public:
static int shared;
S(){
S::shared = 0;
};
};
two.cpp
#include "main.hpp"
#include <iostream>
class MyObject {
public:
MyObject(){
std::cout << "In two -> " << S::shared << "\n";
}
};
MyObject t();
在該試樣S ::共享是靜態對象我想共享。對於這個簡單的測試,我只使用一個int,但在未來它將是一個類的實例。
我唯一的情況A)的嘗試是一個段錯誤...我真的不知道我錯過了什麼。
//結果至今(今天)
[email protected]:~/dev/WebDesign/Scproci$ scons -Q
g++ -o two.os -c -fPIC two.cpp
g++ -o libtwo.so -shared two.os
g++ -o main.o -c -fPIC main.cpp
g++ -o main -Wl,--export-dynamic main.o -ldl
[email protected]:~/dev/WebDesign/Scproci$ ./main
In main -> 0
In main -> 0
基於顯示的內容,您僅顯示第二種方法的代碼,其行爲與預期相同。 – diverscuba23
爲什麼不顯示「在兩個 - > 0」? –
未定義的符號會發生,因爲S :: shared是在main.cpp中定義的,但是當鏈接libtwo.so時,您沒有在其中定義main.o。 – Flame