c++ - Linker Error In C: undefined Reference to "method" c -
i have c file trying build it's giving me linker error. reason beingness cannot find method definition defined @ other source files. trying here have definition of method beingness located source file. giving code main programme trying build. suggestions welcome , appreciated.
#include<stdio.h> #include<jni.h> #include<windows.h> #include <stdbool.h> #include "runnerclass.h" #include "unistd.h" #include "apr_getopt.h" #include "apr_portable.h" #include "c:\jnitest\src\common\error_debug.h" #include "c:\jnitest\src\common\event.h" #include "c:\jnitest\src\common\context.h" #include "c:\jnitest\src\common\alloc.h" #include "c:\jnitest\src\core\nxlog.h" #include "c:\jnitest\src\core\modules.h" #include "c:\jnitest\src\core\router.h" #include "c:\jnitest\src\core\ctx.h" #include "c:\jnitest\src\core\core.h" #define nx_logmodule nx_logmodule_core static nxlog_t nxlog; static apr_os_thread_t _nxlog_initializer = 0; static void winapi nx_win32_svc_main(dword argc, lptstr * argv); static void winapi nx_win32_svc_change(dword); extern void nx_logger_disable_foreground(); static void print_usage(); static void set_configfile(); static bool do_install = false; static bool do_uninstall = false; static service_status svc_status; static service_status_handle *svc_status_handle = null; jniexport void jnicall java_runnerclass_parse_1cmd_1line (jnienv * env, jobject jobj, jint argc, const jstring * const *argv){ char *opt_arg; int rv; apr_getopt_t *opt; int ch; static apr_getopt_option_t options[] = { { "help", 'h', 0, "print help" }, { "foreground", 'f', 0, "run in foreground" }, { "stop", 's', 0, "stop running instance" }, // { "reload", 'r', 0, "reload configuration of running instance" }, { "conf", 'c', 1, "configuration file" }, { "verify", 'v', 0, "verify configuration file syntax" }, { "install", 'i', 0, "install service available service manager" }, { "uninstall", 'u', 0, "uninstall service" }, { null, 0, 1, null }, }; apr_getopt_init(&opt, nxlog.pool, argc,(void *) argv); while ( (rv = apr_getopt_long(opt, options, &ch,(void *) &opt_arg)) == apr_success ) { switch ( ch ) { case 'c': /* configuration file */ nxlog.cfgfile = apr_pstrdup(nxlog.pool, opt_arg); break; case 'f': /* foreground */ nxlog.foreground = true; break; case 'h': /* help */ print_usage(); exit(-1); case 's': /* stop */ nxlog.do_stop = true; break; /* case 'r': // reload nxlog.do_restart = true; break; */ case 'v': /* verify */ nxlog.verify_conf = true; nxlog.ctx->ignoreerrors = false; break; case 'i': /* install */ do_install = true; break; case 'u': /* uninstall */ do_uninstall = true; break; default: print_usage(); exit(-1); } } set_configfile(); if ( (rv != apr_success) && (rv !=apr_eof) ) { throw(rv ,"could not parse options");/////////// } } jniexport void jnicall java_runnerclass_nx_1win32_1svc_1stop (jnienv * env, jobject jobj){ sc_handle service_manager = null; sc_handle service_handle = null; service_status status; nx_exception_t e; // connect service manager service_manager = openscmanager(null, null, sc_manager_all_access); if ( service_manager == null ) { nx_win32_error("cannot initialize access service manager"); } seek { service_handle = openservice(service_manager, "nxlog", service_all_access); if ( service_handle == null ) { nx_win32_error("couldn't open nxlog service"); } else { if ( queryservicestatus(service_handle, &status) ) { if ( status.dwcurrentstate != service_stopped ) { log_info("service currenty active - stopping service..."); if ( !controlservice(service_handle, service_control_stop, &status) ) { nx_win32_error("couldn't stop service"); } else { sleep(500); } } else { log_error("service stopped"); } } // close connection service closeservicehandle(service_handle); } // close connection service manager closeservicehandle(service_manager); } catch(e) { if ( service_handle != null ) { closeservicehandle(service_handle); } if ( service_manager != null ) { closeservicehandle(service_manager); } rethrow(e); } } jniexport void jnicall java_runnerclass_nx_1win32_1svc_1install (jnienv * env, jobject jobj){ sc_handle service_manager; sc_handle new_service = null; hkey regkey; uint32_t regtype = 0; char regvalbuf[1024]; uint32_t regvalbufsize = 1024; char servicename[1024]; // connect service manager service_manager = openscmanager(null, null, sc_manager_all_access); if ( service_manager == null ) { nx_win32_error("cannot initialize access service manager"); } //fixme utilize nxlog.ctx.user invoke service in createservice // default in case registry lookup fail apr_cpystrn(servicename, "\"c:\\program files\\nxlog\\nxlog.exe\" -c \"c:\\program files\\nxlog\\nxlog.conf\"", sizeof(servicename)); if ( regopenkey(hkey_local_machine, "software\\nxlog", ®key) == error_success ) { if ( regqueryvalueex(regkey, "installdir", 0,(void *) ®type,(unsigned char *) regvalbuf,(void *) ®valbufsize) == error_success ) { if ( regtype == reg_sz ) { apr_snprintf(servicename, sizeof(servicename), "\"%snxlog.exe\"", regvalbuf); } } regclosekey(regkey); } // install new service new_service = createservice(service_manager, "nxlog", "nxlog", service_all_access, service_win32_own_process, service_auto_start, service_error_ignore, servicename, null, null, "eventlog\0", null, null); if ( new_service == null ) { nx_win32_error("couldn't create service"); } else { closeservicehandle(new_service); log_info("service installed"); } // close connection service manager closeservicehandle(service_manager); } jniexport void jnicall java_runnerclass_nx_1win32_1svc_1uninstall (jnienv * env, jobject jobj){ sc_handle service_manager = null; sc_handle service_handle = null; service_status query_status; nx_exception_t e; // connect service manager service_manager = openscmanager(null, null, sc_manager_all_access); if ( service_manager == null ) { nx_win32_error("cannot initialize access service manager"); } seek { // connect service service_handle = openservice(service_manager, "nxlog", service_all_access | delete); if ( service_handle == null ) { nx_win32_error("couldn't open nxlog service"); } else { // check service stopped if ( queryservicestatus(service_handle, &query_status) && (query_status.dwcurrentstate == service_running) ) { throw_msg("service running, please stop first."); } else { // can remove if ( deleteservice(service_handle) == false ) { nx_win32_error("couldn't delete service"); } else { log_info("service uninstalled"); } } // close connection service closeservicehandle(service_handle); } // close connection service manager closeservicehandle(service_manager); } catch(e) { if ( service_handle != null ) { closeservicehandle(service_handle); } if ( service_manager != null ) { closeservicehandle(service_manager); } rethrow(e); } } jniexport void jnicall java_runnerclass_nx_1win32_1svc_1main (jnienv * env, jobject jobj, jint argc, jstring *argv){ nx_context_t thread_context; nx_exception_t e; if ( _nxlog_initializer == 0 ) { // running service manager assert(nx_init((void *)&argc, (void *)&argv, null) == true); nxlog_init(&nxlog); nx_logger_disable_foreground(); } else if ( _nxlog_initializer != apr_os_thread_current() ) { // service dispatcher runs in new thread, need // initialize exception context. _nxlog_initializer = apr_os_thread_current(); memset(&thread_context, 0, sizeof(nx_context_t)); init_exception_context(&thread_context.exception_context); apr_threadkey_private_set(&thread_context, nx_get_context_key()); } log_debug("nx_win32_svc_main"); seek { // read config cache nx_config_cache_read(); log_debug("nxlog cache read"); // load dso , read , verify module config nx_ctx_config_modules(nxlog.ctx); log_debug("nxlog config ok"); // initialize modules nx_ctx_init_modules(nxlog.ctx); // initialize log routes nx_ctx_init_routes(nxlog.ctx); nx_ctx_init_jobs(nxlog.ctx); nx_ctx_restore_queues(nxlog.ctx); // setup threadpool nxlog_create_threads(&nxlog); // start modules nx_ctx_start_modules(nxlog.ctx); if ( nxlog.foreground != true ) { // register service manager svc_status_handle = (void *)registerservicectrlhandler("nxlog", nx_win32_svc_change); if ( svc_status_handle == 0 ) { nx_win32_error("registerservicectrlhandler() failed, couldn't register service command handler"); } // signal svc manager running svc_status.dwwin32exitcode = 0; svc_status.dwservicespecificexitcode = 0; svc_status.dwcheckpoint = 0; svc_status.dwwaithint = 0; svc_status.dwservicetype = service_win32; svc_status.dwcurrentstate = service_running; svc_status.dwcontrolsaccepted = service_accept_stop; if ( setservicestatus(*svc_status_handle, &svc_status) == false ) { nx_win32_error("cannot send start service status update"); } } //log_info(package"-"version_string" started"); } catch(e) { log_exception(e); log_error("exiting..."); svc_status.dwcurrentstate = service_stopped; setservicestatus(*svc_status_handle, &svc_status); exit(e.code); } // mainloop nxlog_mainloop(&nxlog, false); nxlog_shutdown(&nxlog); if ( nxlog.foreground != true ) { // signal stopped svc_status.dwcurrentstate = service_stopped; setservicestatus(*svc_status_handle, &svc_status); } nxlog_exit_function(); } jniexport void jnicall java_runnerclass_nx_1win32_1svc_1dispatch (jnienv * env, jobject jobj){ static service_table_entry svc_dispatch_table[] = { { "nxlog", null }, { null, null } }; if ( startservicectrldispatcher(svc_dispatch_table) == false ) { nx_win32_error("cannot start service dispatcher"); } } jniexport void jnicall java_runnerclass_nx_1win32_1svc_1start (jnienv * env, jobject jobj, jint argc, jstring argv){ sc_handle service_manager = null; sc_handle service_handle = null; service_status status; nx_exception_t e; // connect service manager service_manager = openscmanager(null, null, sc_manager_all_access); if ( service_manager == null ) { nx_win32_error("cannot initialize access service manager"); } seek { service_handle = openservice(service_manager, "nxlog", service_all_access); if ( service_handle == null ) { nx_win32_error("couldn't open nxlog service"); } else { if ( queryservicestatus(service_handle, &status) ) { if ( status.dwcurrentstate != service_running ) { log_info("service not running - starting service..."); if ( startservice(service_handle, argc,(void *) argv) == 0 ) { nx_win32_error("failed start nxlog service"); } } else { log_error("service running"); } } // close connection service closeservicehandle(service_handle); } // close connection service manager closeservicehandle(service_manager); } catch(e) { if ( service_handle != null ) { closeservicehandle(service_handle); } if ( service_manager != null ) { closeservicehandle(service_manager); } rethrow(e); } } jniexport void jnicall java_runnerclass_nxlog_1exit_1function (jnienv * env, jobject jbobj){ static bool exited = false; if ( exited == true ) { return; } exited = true; if ( _nxlog_initializer == 0 ) { return; } if ( nxlog.pid != (int) getpid() ) { return; } nx_ctx_free(nxlog.ctx); apr_pool_destroy(nxlog.pool); apr_terminate(); } /* callback service changes */ static void winapi nx_win32_svc_change(dword cmd) { // stop command handled switch ( cmd ) { case service_control_stop: log_warn("stopping nxlog service"); nxlog.terminate_request = true; // wait until service stops while ( svc_status.dwcurrentstate != service_stopped ) { sleep(500); } break; case service_control_interrogate: // ignore log_debug("ignoring unsupported service alter request: service_control_interrogate"); break; case service_control_pause: log_warn("ignoring unsupported service alter request: service_control_pause"); break; case service_control_continue: log_warn("ignoring unsupported service alter request: service_control_continue"); break; case service_control_paramchange: log_warn("ignoring unsupported service alter request: service_control_paramchange"); break; case 200: nxlog_dump_info(); break; case 201: { nx_ctx_t *ctx; log_info("got user command signal, switching debug loglevel"); ctx = nx_ctx_get(); ctx->loglevel = nx_loglevel_debug; } break; default: log_warn("ignoring unsupported service alter request (%d)", cmd); } } static void print_usage() { printf(/*package*/ "-" /*ersion_string*/ "\n" " usage: " " nxlog.exe [options]\n" " [-h] print help\n" " [-f] run in foreground, otherwise seek start nxlog service\n" " [-c conffile] specify alternate config file\n" " [-i] install service available service manager\n" " [-u] uninstall service\n" " [-s] stop running nxlog service\n" " [-v] verify configuration file syntax\n" ); // " [-r] reload configuration of running instance\n" } static void set_configfile() { hkey regkey; uint32_t regtype = 0; char regvalbuf[1024]; uint32_t regvalbufsize = 1024; if ( nxlog.cfgfile != null ) { return; } if ( regopenkey(hkey_local_machine, "software\\nxlog", ®key) == error_success ) { if ( regqueryvalueex(regkey, "installdir", 0, (void *)®type, (unsigned char *) regvalbuf,(void *) ®valbufsize) == error_success ) { if ( regtype == reg_sz ) { nxlog.cfgfile = apr_psprintf(nxlog.pool, "%sconf\\nxlog.conf", regvalbuf); } } regclosekey(regkey); } if ( nxlog.cfgfile == null ) { //nxlog.cfgfile = apr_pstrdup(nxlog.pool, nx_configfile); } }
what's exact error message getting???
from memory, jniexport not include ' extern "c" ' - if source file c++ function name mangled (and linker not find them).
c++ c linker-error undefined-reference
No comments:
Post a Comment