File tree Expand file tree Collapse file tree 3 files changed +114
-0
lines changed Expand file tree Collapse file tree 3 files changed +114
-0
lines changed Original file line number Diff line number Diff line change @@ -302,5 +302,37 @@ if(BUILD_TESTING)
302302 NAME tests_PythonQtTestMain
303303 COMMAND ${Slicer_LAUNCH_COMMAND} $<TARGET_FILE:PythonQtCppTests> tests/PythonQtTestMain
304304 )
305+
306+ #
307+ # tests_PythonQtDynamicLoading: This test checks that a dynamically loaded library (itself linked against
308+ # PythonQt) properly initializes PythonQt.
309+ #
310+
311+ add_library (PythonQtDynamicLoaderSharedLibrary SHARED tests/PythonQtDynamicLoaderSharedLibrary.cpp)
312+ target_link_libraries (PythonQtDynamicLoaderSharedLibrary PythonQt)
313+
314+ add_executable (PythonQtDynamicLoader tests/PythonQtDynamicLoader.cpp)
315+ target_link_libraries (PythonQtDynamicLoader ${QT_LIBRARIES} )
316+
317+ # Since setting the ENVIRONMENT property value with semicolon (e.g. PATH) is not supported, we
318+ # generate a wrapper script to update PATH and LD_LIBRARY_PATH.
319+ set (test_wrapper "${CMAKE_CURRENT_BINARY_DIR} /test_wrapper.cmake" )
320+ file (WRITE ${test_wrapper} "
321+ if(UNIX)
322+ set(ENV{LD_LIBRARY_PATH} \"\$ ENV{LD_LIBRARY_PATH}:.\" )
323+ else()
324+ set(ENV{PATH} \"\$ ENV{PATH};.\" )
325+ endif()
326+ execute_process(COMMAND \$ {TARGET_FILE} RESULT_VARIABLE result)
327+ if(NOT result EQUAL 0)
328+ message(FATAL_ERROR \" test failed ! [result: \$ {result}]\" )
329+ endif()
330+ " )
331+
332+ add_test (
333+ NAME tests_PythonQtDynamicLoading
334+ COMMAND ${CMAKE_COMMAND} -DTARGET_FILE=$<TARGET_FILE:PythonQtDynamicLoader> -P ${test_wrapper}
335+ )
336+
305337endif ()
306338
Original file line number Diff line number Diff line change 1+
2+ #include < QApplication>
3+ #include < QLibrary>
4+ #include < QtGlobal>
5+
6+ #include < cstdlib>
7+ #include < iostream>
8+
9+ int main (int argc, char * argv[])
10+ {
11+ QApplication qapp (argc, argv);
12+
13+ #ifdef Q_OS_WIN32
14+ std::cout << " PATH [" << qPrintable (qgetenv (" PATH" )) << " ]" << std::endl;
15+ #else
16+ std::cout << " LD_LIBRARY_PATH [" << qPrintable (qgetenv (" LD_LIBRARY_PATH" )) << " ]" << std::endl;
17+ #endif
18+
19+
20+ QLibrary library (" PythonQtDynamicLoaderSharedLibrary" );
21+ if (!library.load ())
22+ {
23+ std::cerr << " Failed to load 'PythonQtDynamicLoaderSharedLibrary': "
24+ << qPrintable (library.errorString ()) << std::endl;
25+ return EXIT_FAILURE;
26+ }
27+
28+ //
29+ // Resolve and invoke 'this_function_returns_42' function.
30+ //
31+ typedef int (*FUNC_RETURNS_INT_TYPE)();
32+ FUNC_RETURNS_INT_TYPE func = (FUNC_RETURNS_INT_TYPE) library.resolve (" this_function_returns_42" );
33+ if (!func)
34+ {
35+ std::cerr << " Failed to resolve symbol 'this_function_returns_42'" << std::endl;
36+ return EXIT_FAILURE;
37+ }
38+ int result = func ();
39+ int expected = 42 ;
40+ if (result != expected)
41+ {
42+ std::cerr << " Problem with function 'this_function_returns_42':\n "
43+ << " \t result: " << result << " \n "
44+ << " \t expected: " << expected
45+ << std::endl;
46+ return EXIT_FAILURE;
47+ }
48+ return EXIT_SUCCESS;
49+ }
50+
Original file line number Diff line number Diff line change 1+
2+
3+ #include " PythonQt.h"
4+
5+ #ifdef Q_OS_WIN
6+ #define MY_EXPORT __declspec (dllexport)
7+ #else
8+ #define MY_EXPORT
9+ #endif
10+
11+ extern " C"
12+ {
13+
14+ int MY_EXPORT this_function_returns_42 ()
15+ {
16+ return 42 ;
17+ }
18+
19+ }
20+
21+ struct StaticInitializer
22+ {
23+ StaticInitializer ()
24+ {
25+ std::cout << " PythonQtDynamicLoaderSharedLibrary::StaticInitializer" << std::endl;
26+ PythonQt::init (PythonQt::IgnoreSiteModule | PythonQt::RedirectStdOut);
27+ }
28+ };
29+
30+
31+ StaticInitializer staticInitializer;
32+
You can’t perform that action at this time.
0 commit comments