#include <stdio.h>
#include <stdlib.h>
#if defined(PLATFORM_WIN)
#include <windows.h>
#elif defined(PLATFORM_MAC) || defined(PLATFORM_LINUX)
#include <dlfcn.h>
#include <libgen.h>
#include <string.h>
#include <sys/param.h>
#define MAX_PATH PATH_MAX
#endif
#if defined(PLATFORM_WIN)
#define MODULE_SUFFIX ".dll"
#elif defined(PLATFORM_MAC)
#define MODULE_SUFFIX ".so"
#elif defined(PLATFORM_LINUX)
#define MODULE_SUFFIX ".so"
#endif
typedef void (*module_symbol)(void);
char bin_path[MAX_PATH + 1];
void CallModule(const char* module) {
char module_path[MAX_PATH + 1];
const char* module_function = "module_main";
module_symbol funcptr;
#if defined(PLATFORM_WIN)
HMODULE dl;
char drive[_MAX_DRIVE];
char dir[_MAX_DIR];
if (_splitpath_s(bin_path, drive, _MAX_DRIVE, dir, _MAX_DIR,
NULL, 0, NULL, 0)) {
fprintf(stderr, "Failed to split executable path.\n");
return;
}
if (_makepath_s(module_path, MAX_PATH, drive, dir, module, MODULE_SUFFIX)) {
fprintf(stderr, "Failed to calculate module path.\n");
return;
}
dl = LoadLibrary(module_path);
if (!dl) {
fprintf(stderr, "Failed to open module: %s\n", module_path);
return;
}
funcptr = (module_symbol) GetProcAddress(dl, module_function);
if (!funcptr) {
fprintf(stderr, "Failed to find symbol: %s\n", module_function);
return;
}
funcptr();
FreeLibrary(dl);
#elif defined(PLATFORM_MAC) || defined(PLATFORM_LINUX)
void* dl;
char* path_copy = strdup(bin_path);
char* bin_dir = dirname(path_copy);
int path_size = snprintf(module_path, MAX_PATH, "%s/%s%s", bin_dir, module,
MODULE_SUFFIX);
free(path_copy);
if (path_size < 0 || path_size > MAX_PATH) {
fprintf(stderr, "Failed to calculate module path.\n");
return;
}
module_path[path_size] = 0;
dl = dlopen(module_path, RTLD_LAZY);
if (!dl) {
fprintf(stderr, "Failed to open module: %s\n", module_path);
return;
}
funcptr = dlsym(dl, module_function);
if (!funcptr) {
fprintf(stderr, "Failed to find symbol: %s\n", module_function);
return;
}
funcptr();
dlclose(dl);
#endif
}
int main(int argc, char *argv[])
{
fprintf(stdout, "Hello from program.c\n");
fflush(stdout);
#if defined(PLATFORM_WIN)
if (!GetModuleFileName(NULL, bin_path, MAX_PATH)) {
fprintf(stderr, "Failed to determine executable path.\n");
return 1;
}
#elif defined(PLATFORM_MAC) || defined(PLATFORM_LINUX)
// Using argv[0] should be OK here since we control how the tests run, and
// can avoid exec and such issues that make it unreliable.
if (!realpath(argv[0], bin_path)) {
fprintf(stderr, "Failed to determine executable path (%s).\n", argv[0]);
return 1;
}
#endif
CallModule("lib1");
CallModule("lib2");
return 0;
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
gyp 支持最新vs2015 (1486个子文件)
override_asm.asm 277B
a.asm 109B
safeseh_zero.asm 109B
asm-function.assem 199B
AUTHORS 284B
foo.bar 201B
somecmd.bat 265B
as.bat 226B
gyp.bat 201B
samples.bat 196B
bat with spaces.bat 182B
go.bat 182B
as.bat 59B
stuff.blah 18B
program.c 3KB
check-version-min.c 1KB
check-version-min.c 1KB
main.c 683B
file.c 658B
includes.c 534B
program.c 494B
staticlib.c 451B
defines.c 444B
calculate.c 444B
prog3.c 412B
prog1.c 412B
prog2.c 412B
writefile.c 402B
test.c 402B
prog3.c 380B
b.c 375B
sharedlib.c 367B
hello.c 362B
program.c 361B
main.c 349B
configurations.c 334B
program.c 326B
hello2.c 313B
hello.c 304B
hello.c 304B
test.c 298B
subdir_includes.c 297B
cflags.c 296B
32or64.c 291B
program.c 279B
hello.c 277B
precomp.c 277B
mymalloc.c 276B
prog1.c 275B
prog2.c 275B
main.c 262B
main-crt.c 261B
valid_c.c 258B
program.c 251B
prog.c 250B
defines-escaping.c 248B
hello.c 247B
there.c 247B
hello.c 247B
module.c 244B
hello.c 243B
hello.c 243B
hello.c 243B
warn_about_missing_newline.c 242B
hello2.c 241B
hello.c 240B
hello2.c 239B
input_dirname.c 234B
test.input_root.c 228B
test.c 228B
test.c 228B
c.c 228B
configurations.c 226B
input_ext.c 226B
foo.c 225B
a.c 218B
configurations.c 216B
program.c 214B
b.c 213B
d.c 213B
hello.c 212B
c.c 212B
file.c 210B
a.c 209B
a.c 208B
mylib.c 198B
mylib.c 198B
b3.c 195B
main.c 187B
main.c 187B
main.c 187B
main.c 187B
file.c 186B
file.c 186B
program.c 176B
main.c 173B
main.c 173B
program.c 171B
empty.c 171B
file_g.c 171B
共 1486 条
- 1
- 2
- 3
- 4
- 5
- 6
- 15
yoc
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
前往页