Здесь, я сделал следующее.
Это мой C++ код:
#include<iostream>
void foo(int x) {
std::cout<<"calling foo("<<x<<")"<<std::endl;
}
int main() {
return 0;
}
Это, как я скомпилировать:
g++ program.cpp -o program -O0
Это, как я могу определить имя функции foo
:
[myprompt ~] nm program
0000000100001090 S _NXArgc
0000000100001098 S _NXArgv
0000000100000e70 t __GLOBAL__sub_I_program.cpp
0000000100000dcc T __Z3fooi
0000000100000e28 t __Z41__static_initialization_and_destruction_0ii
U __ZNSolsEPFRSoS_E
U __ZNSolsEi
U __ZNSt8ios_base4InitC1Ev
U __ZNSt8ios_base4InitD1Ev
U __ZSt4cout
U __ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_
0000000100001088 s __ZStL8__ioinit
U __ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
U ___cxa_atexit
00000001000010a8 S ___progname
0000000100000000 T __mh_execute_header
00000001000010a0 S _environ
U _exit
0000000100000e1d T _main
0000000100001000 s _pvars
U dyld_stub_binder
0000000100000d90 T start
И вот как я называю функцию foo
(я делаю это с Python, потому что я ленив, но вы можете d o это с помощью любой другой программы, которая позволяет загружать библиотеки).
import ctypes
program = ctypes.CDLL("./program")
program._Z3fooi(ctypes.c_int(2))
Пробег:
[myprompt ~] python callprogram.py
calling foo(2)
Это не портативный (имя коверкание может отличаться от компиляторов, от платформы). Меня устраивает. Но мне никогда не нужно это делать, поэтому мне интересно, насколько это полезно.
Вызов функции откуда? –
Это необоснованно, если вы не пытаетесь создать какой-то варез. Существует почти наверняка лучший способ сделать это, если ваш случай использования является законным. –
Является ли эта функция экспортируемой? Я имею в виду, видите ли вы это в таких инструментах, как DLL Export Viewer? http://www.nirsoft.net/utils/dll_export_viewer.html – kol